新特性解讀 | MySQL 最新的release notes(轉載)
原創作者公眾號:yangyidba
從MySQL釋出正式版本8.0.11以來,MySQL又相繼釋出8.0.12-8.0.15四個版本,本文著重介紹MySQL 8.0.13和8.0.14 版本中值得關注的改進點。
為什麼不關注8.0.15,因為8.0.15的release notes 基本沒啥資訊。
MySQL 8.0.13
部分改進和特性
1.提高SELECT COUNT() FROM tbl_name 語句的查詢速度,注意只針對沒有where條件的SQL或者沒有其他group by的查詢語句。例如 select count() from t where a=x 則不能優化。
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優化器越來越強大,但是開發建立索引時還是要儘可能的滿足最左字首原則
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,並且在未來的版本中移除。
MySQL 8.0.14 部分改進和特性
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"一致性讀寫"特性解讀。