選取了部分覺得能用上的,完整版參考《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無效。