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

背景:html

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

1,功能性能上的提高
mysql

1.1:複製功能的提高。linux

①支持並行複製。slave-parallel-type算法

5.6開始支持基於庫(database)的並行複製,對於只有一個庫的,效果很差。5.7開始支持基於組提交(LOGICAL_CLOCK)的並行複製,提升複製的可用性。sql

②支持多源複製,經過channel支持一個從庫複製多個主庫。shell

③支持在線修改REPLICATION FILTERREPLICATE_DO_DB、REPLICATE_IGNORE_DB。經過change replicate filter,須要中止SQL thread,修改完成之後,啓動SQL thread。能夠參考這篇文章數據庫

因爲篇幅的緣由,後面會另起一篇文章介紹上面功能的細節。json

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來對」信息系統」來進行分詞,獲得的結果以下:

相關文章
相關標籤/搜索