MySQL 5.7 學習:功能性能的提升


背景:

繼上次介紹 初識 MySQL 5.6 新功能、參數完之后,剛好MySQL 5.7又GA了,在官方測試里看到,MySQL5.7在功能、性能、可用性、安全和監控上又提升了很高。現在看看和MySQL5.6對比,之前介紹了新增配置參數安全相關特性。本文來說明MySQL5.7關於功能和性能提升的方面(持續更新)。

1,功能性能上的提升

1.1:復制功能的提升。

①支持並行復制。slave-parallel-type

5.6開始支持基於庫(database)的並行復制,對於只有一個庫的,效果不好。5.7開始支持基於組提交(LOGICAL_CLOCK)的並行復制,提高復制的可用性。

②支持多源復制,通過channel支持一個從庫復制多個主庫。

③支持在線修改REPLICATION FILTERREPLICATE_DO_DB、REPLICATE_IGNORE_DB。通過change replicate filter,需要停止SQL thread,修改完成以后,啟動SQL thread。可以參考這篇文章

由於篇幅的原因,后面會另起一篇文章介紹上面功能的細節。

1.2:mysqlpump並行版 mysqldump,也是替換原生 mysqldump 和 mydumper 的。--watch-progress 查看dump進度,--compress-ouptut 壓縮,也支持 SSL。 大致的優勢如下:(后面會起一篇文章來說明mysqlpump的使用)

  • 支持基於表的並行導出功能(參數–default-parallelism,默認為2,參數–parallel-schemas,控制並行導出的庫)
  • 導出的時候帶有進度條(參數–watch-progress,默認開啟)
  • 支持直接壓縮導出導入(參數–compress-output,支持ZLIB和LZ4)

1.3:online alter table初識 MySQL 5.6 新功能、參數里介紹的online ddl的基礎上又增加了:

①:在線加主鍵:當主鍵列為null字段的時候,5.6建主鍵需要復制表,5.7可以inplace:

5.6>create table test(id int);
Query OK, 0 rows affected (0.00 sec)
>insert into test values(1),(2),(3);                                                                                                        
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
>alter table test add primary key(id);                                                                                                        Query OK, 3 rows affected (0.01 sec) Records: 3  Duplicates: 0  Warnings: 0 ###copy

5.7>create table test(id int);                                                                                                                 Query OK, 0 rows affected (0.01 sec)
>insert into test values(1),(2),(3); 
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
>alter table test add primary key(id); Query OK, 0 rows affected (0.03 sec) ###inplace Records: 0  Duplicates: 0  Warnings: 0

②:varchar長度變更(加大)支持inplace,需要注意的是有一個限制,即用於表示varchar字段長度的字節數不能發生變化,也就是支持比如varchar的字節長度在255(Latin1)以下變更或者255以上的范圍進行變更,因為從小於255變更到大於255,其size的字節需要從1個增加到2個,另一個注意的是不允許inplace字段長度變小:

>show create table test\G
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `id` int(11) NOT NULL,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

>alter table test modify name varchar(64);   ##inplace modify
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

>alter table test modify name varchar(128);  ##inplace modify
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

>alter table test modify name varchar(255);  ##inplace modify
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

>alter table test modify name varchar(256);  ##copy modify,超過了255
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

>alter table test modify name varchar(64);   ##copy modify,長度變小
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

③:支持online rename index操作:

>show create table test\G                                                                                                                   *************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `id` int(11) NOT NULL,
  `name` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

>alter table test rename index name to idx_name;

...

1.4:Undo Log日志的在線回收。innodb undo log占用共享表空間並且無法回收,在5.6的時候可以把undo log分離到獨立的表空間,並放到單獨的文件目錄下,但是其文件大小也不會回收。5.7之后可以在線收縮undo log:需要開啟innodb_undo_log_truncateinnodb_undo_tablespacesinnodb_undo_directory參數,當大小超過innodb_max_undo_log_size的大小則會被undo會被標記為可truncate。具體的原理可以看這篇文章。undo log 在整個事務未提交前,undo page是必須強占內存,這會讓buffer pool size 收到污染,可以看這個例子說明。

1.5:新增json類型。關於json類型操作的函數參考官方文檔MySQL5.7 JSON類型使用介紹,原理介紹見MySQL5.7的JSON 實現

MySQL對支持JSON的做法是在server層提供了一堆便於操作JSON的函數,簡單地將JSON編碼成BLOB,然后交由存儲引擎層進行處理。MySQL 5.7的JSON支持與存儲引擎沒有關系,MyISAM 存儲引擎也支持JSON 格式。MySQL對JSON的支持,至少有兩點能夠完勝MongoDB:可以混合存儲結構化數據和非結構化數據,同時擁有關系型數據庫和非關系型數據庫的優點;能夠提供完整的事務支持。

1.6:generate column。一列由其他列計算而得,可生成索引的虛擬化列。

mysql> create table t(id int,score int,score_ss int as (score*33));
Query OK, 0 rows affected (0.25 sec)

mysql> select * from t;
Empty set (0.00 sec)

mysql> select * from t;
Empty set (0.00 sec)

mysql> insert into t(id,score) values(1,10);
Query OK, 1 row affected (0.03 sec)

mysql> select * from t;
+------+-------+----------+
| id   | score | score_ss |
+------+-------+----------+
|    1 |    10 |      330 |
+------+-------+----------+

建表標准的語法:
CREATE TABLE `t` (
  `id` int(11) DEFAULT NULL,
  `score` int(11) DEFAULT NULL,
  `score_ss` int(11) GENERATED ALWAYS AS ((`score` * 33)) VIRTUAL/STORED, KEY `idx_score_ss` (`score_ss`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 MySQL5.7支持兩種generated column,即virtual generated column和stored generated column,前者只將generated column保存在數據字典中(表的元數據),並不會將這一列數據持久化到磁盤上;后者會將generated column持久化到磁盤上,而不是每次讀取的時候計算所得。很明顯,后者存放了可以通過已有數據計算而得的數據,需要更多的磁盤空間,與virtual column相比並沒有優勢。因此,在不指定generated column的類型時,默認是virtual column,並且為generate column創建索引可以提高性能。 

1.7:InnoDB 全文索引的加強:支持中文分詞。InnoDB默認的全文索引parser非常合適於Latin,因為Latin是通過空格來分詞的。可以看這篇文章的介紹,但對於像中文,日文和韓文來說,沒有這樣的分隔符。一個詞可以由多個字來組成,所以我們需要用不同的方式來處理。在MySQL 5.7.6中我們能使用一個新的全文索引插件來處理它們:n-gram parser。關於n-gram的介紹和使用可以看這篇文章

在全文索引中,n-gram就是一段文字里面連續的n個字的序列。例如,用n-gram來對”信息系統”來進行分詞,得到的結果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM