MySQL 5.7 新特性筆記

選取了部分覺得能用上的,完整版參考《MySQL管理之道,性能調優,高可用與監控》

一、 安全性

1. 默認開啓SSL

在傳輸層加密網絡連接,保障數據在網絡傳輸的安全。

配置與使用

通過如下命令開啓SSL加密,執行後會在/data目錄下生成.pem文件,這就是ssl連接所需的文件。

mysql_ssl_rsa_setup

創建用戶時需要指定該用戶通過SSL連接。

create user username@'192.0.%' identified by 'xxx' require ssl;

用戶登錄按照普通方法即可

mysql -uxxx -p

 

2. 不再明文顯示用戶密碼

MariaDB 10.1對binlog中的用戶密碼是不加密的

而MySQL 5.7會做加密處理。

 

3. sql_mode的改變

5.6中sql_mode默認爲空,5.7中爲strict_trans_tables嚴格模式,錯誤數據不能插入且事務回滾。

 

二、 InnoDB存儲引擎提升

1. (在線)修改索引名

5.7之前mysql是不支持改索引名的,只能drop後重建。

alter table mytbs rename index ind_old to ind_new;

 

2. 加長varchar字段不鎖表

例如將varchar(60) 改爲varchar(80),既不用拷貝數據也不用鎖表。

但有如下限制:

  • 字段屬性>=varchar(256)時,256是字節數(UTF8佔3字節)會鎖表
  • 改短varchar字段會鎖表,例如varchar(80) 改爲varchar(60)
  • 僅針對varchar,int,char類型不適用
  • online DDL期間會降低數據庫吞吐量
  • 修改期間該表寫入數據量超過innodb_online_alter_log_max_size(默認128M)會報錯,當前所有未提交dml事務回滾。

online DDL的原理是在ddl操作執行的同時將對錶的dml操作日誌寫入緩存中,待ddl完成後將dml操作應用到對應表上。緩存的大小即由innodb_online_alter_log_max_size參數來指定,如果該參數設置過大、對錶的寫操作又很多,ddl完成後dml操作可能要應用很久。

補充:

  • 增加、刪除普通字段一般不鎖全表
  • 刪除主鍵鎖全表
  • 執行alter table前如果有對該表的慢查詢,須等慢查詢執行完纔會執行alter table語句,此時alter table語句會等待mdl鎖並阻塞後面dml語句。

鑑於限制過多,對大表執行DDL操作還是建議業務低峯期進行,或者使用pt-online-schema-change工具。

 

3. buffer pool預熱改進

5.6引入了一個新特性來快速預熱buffer pool,只需在my.cnf中設置

innodb_buffer_pool_dump_at_shutdown=1 # 在正常停庫時將熱數據dump到本地磁盤ib_buffer_pool文件中(kill mysql進程是不會dump的)
innodb_buffer_pool_load_at_startup=1 # 起庫時將熱數據加載到內存

5.7引入了一個新參數 innodb_buffer_pool_dump_pct 改進此新特性,允許控制每個緩衝池最近使用頁的百分比來導出,避免導出所有頁佔用過多磁盤,默認值爲25%。

 

4. 在線調整buffer pool大小

修改innodb_buffer_pool_size參數不再需要重啓mysql生效,但是調整期間用戶請求會被阻塞直到調整完畢,建議在業務低峯期做。

set global innodb_buffer_pool_size=256*1024*1024 -- 256M

 

 

5. 在線收縮undo log物理文件空間

undo log默認保存在ibdata1文件裏,隨着業務進行會越來越大。5.6支持將其移動到單獨表空間,但不支持收縮,直到5.7版本才支持在線收縮undo log物理文件空間。

以下undo相關參數需要在安裝mysql時指定,數據庫創建後指定會報錯。

 

6. 支持創建通用表空間

可以指定某些表放在同一表空間中,需開啓以下參數

innodb_file_per_table=1

 

7. 死鎖信息可以記入錯誤日誌(5.6也支持)

死鎖信息可執行以下命令查看

show engine innodb status\G;

或在my.cnf中配置

innodb_print_all_deadlocks=1

 

三、 功能提升

  • 支持用json格式存儲數據

  • 支持一張表上有多個DML觸發器

  • Ctrl+C組合鍵不會退出客戶端,而僅中止當前命令

  • 可將錯誤日誌打印到系統日誌,啓動mysql服務或客戶端連接時加 --syslog參數即可

  • 可查看update、delete語句執行計劃(5.6開始支持,之前只支持explain select語句)

  • 提供審計功能(5.6/5.7企業版支持,需安裝審計插件)

 

四、 性能提升

1. innodb效率及併發性改進

消除innodb內核原有的線程爭用和互斥鎖現象,QPS約爲5.6的3倍、TPS約爲5.6的2倍。

 

2. 支持函數索引

可在表中使用虛擬列,併爲虛擬列創建索引。

 

3. 針對子查詢採用半連接優化

MySQL的子查詢一直以性能差著稱,常用的解決方案是用關聯代替子查詢。從5.6開始,子查詢有了強勁優化,不改變原有sql的情況下,優化器能自動將子查詢轉爲關聯查詢。

MySQL 5.5版本會先掃描外表中的所有數據,每條數據傳到內表與之關聯,如果外表很大,性能會很差。5.6採用半連接優化後,先過濾內表數據再跟外表進行關聯,效率大大提高。

5.5的子查詢執行計劃是將in重寫爲exists,5.6之後則是將in和exists重寫爲join。

半連接子查詢優化默認開啓,可通過以下語句查看:

show variable like 'optimizer_switch'\G;

但是,半連接優化只針對查詢,update、delete性能依然很差,仍舊是先查外表再關聯內表。

 

4. 優化in條件表達式

在5.6中執行以下查詢,即使id是主鍵、k是索引也只能走全表掃描。

select * from sbtest where (id,k) in ((11,0),(12,0));

但在5.7中,可以走索引,優化器已自動將其改寫爲

select * from sbtest where (id=11 and k=0) or (id=22 and k=0);

 

5. 優化union all

5.7版本中union all不再創建一張臨時表,在執行大的聯合查詢時會減少IO開銷,但對union和在最外層使用order by無效。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章