原創做者公衆號:yangyidbahtml
從MySQL發佈正式版本8.0.11以來,MySQL又相繼發佈8.0.12-8.0.15四個版本,本文着重介紹MySQL 8.0.13和8.0.14 版本中值得關注的改進點。mysql
爲何不關注8.0.15,由於8.0.15的release notes 基本沒啥信息。算法
1.提升SELECT COUNT() FROM tbl_name 語句的查詢速度,注意只針對沒有where條件的SQL或者沒有其餘group by的查詢語句。例如 select count() from t where a=x 則不能優化。sql
2.支持Skip Scan access有點像跳躍索引掃描,看官方的例子:數據庫
CREATE TABLE t1 (f1 INT NOT NULL, f2 INT NOT NULL, PRIMARY KEY(f1, f2)); INSERT INTO t1 VALUES (1,1), (1,2), (1,3), (1,4), (1,5), (2,1), (2,2), (2,3), (2,4), (2,5); INSERT INTO t1 SELECT f1, f2 + 5 FROM t1; INSERT INTO t1 SELECT f1, f2 + 10 FROM t1; INSERT INTO t1 SELECT f1, f2 + 20 FROM t1; INSERT INTO t1 SELECT f1, f2 + 40 FROM t1; ANALYZE TABLE t1; EXPLAIN SELECT f1, f2 FROM t1 WHERE f2 > 40;
新的算法的執行僞算法以下:安全
優化器能使用Skip Scan access必須知足:併發
1 select的字段必須都在組合索引中,也即知足覆蓋索引的條件。 2 索引最左前綴不在where條件中。(a,b,c,d) a 不在where 條件中,可是b c必須在。 3 查詢只能涉及到一個單表。 4 查詢sql不能使用group by 或者distinct 5 where 條件中必須有非最左前綴必須有範圍查詢,好比索引是(a,b,c) where b>20 .
我的感受這個特性顛覆了DBA常常告訴開發的最左前綴原則,是對不合適索引設計的補充。儘管MySQL優化器愈來愈強大,可是開發建立索引時仍是要儘量的知足最左前綴原則,也能夠參考 乾貨 | 解讀MySQL 8.0新特性:Skip Scan Range。app
3.還有其餘是數據文件加密和MRG相關改進,有興趣的能夠本身去看看。運維
之後要廢棄且在將來的版本中移除的參數和特性優化
1.之後不在支持存放分區表在共享表空間。
2.CREATE TEMPORARY TABLE 的語法之後廢棄 TABLESPACE = innodb_file_per_table and TABLESPACE = innodb_temporary 的屬性。
3.廢棄utf8mb3字符集,請使用utf8mb4代替。話說應該不多人用utf8mb3字符集吧。
4.移除 metadata_locks_cache_size 和metadata_locks_hash_instances。
5.廢棄sql_mode:PAD_CHAR_TO_FULL_LENGTH,而且在將來的版本中移除。
1.加強系統可運維性,增長管理員鏈接地址,在MySQL系統鏈接滿的狀況下,管理員能夠經過admin_address登陸數據庫進行維護操做。其實這個相似管理端口的功能。
2.支持帳號設置雙密碼,修改底層密碼時系統能夠更平滑,提供系統安全性和穩定性。例如:
ALTER USER 'appuser1'@'host1.example.com' IDENTIFIED BY 'password_b' RETAIN CURRENT PASSWORD;
3.以前的8.0版本是系統默認建立2個undo表空間,新版本支持建立額外的undo表空間而且能夠在運行時刪除額外的undo表空間。
CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu'; DROP UNDO TABLESPACE tablespace_name;
還能夠經過alter命令動態的設置undo 表空間的ACTIVE|INACTIVE狀態。
4.支持併發聚族索引讀取,提升check table的速度。其併發數量由innodb_parallel_read_threads 控制,默認是4,須要注意的是該功能不支持輔助索引。
5.當innodb_dedicated_server爲開啓時,log file的數量和大小能夠根據系統的buffer pool size 自動調整。以前的版本是根據os系統的內存大小設置的,並且log file的數量不是自動調整的。注意: 若是不是獨享物理機,官方文檔並不推薦打開該參數,具體能夠參考官方文檔。
6.alter table命令支持in-place的方式修改字符集了,不過須要知足以下三個條件:
a. 字符集類型是char,varchar,text或者enum
b. 字符集類型從utf8mb3 修改成utf8mb4,或者由任意字符集修改成binary
c. 被修改的字段非索引字段
7.MRG新增參數 group_replication_consistency 控制集羣數據一致性,防止集羣容災切換時,新的主庫沒有應用完backlog,業務請求訪問新的主庫可能會讀取老的數據。該參數有EVENTUAL,BEFORE_ON_PRIMARY_FAILOVER,BEFORE,AFTER,BEFORE_AND_AFTER 四個值。默認爲EVENTUAL,能夠不等日誌應用完成便可讀寫。若是設置爲 BEFORE_ON_PRIMARY_FAILOVER 則新的讀寫請求會被阻塞住,直到日誌被應用完成,詳細信息參考 社區投稿 | MySQL MGR"一致性讀寫"特性解讀。