一、mysql8.0組合索引與5.5版本的差異
1、索引大小限制不同
MySQL 8.0中默認的索引大小上限是3072字節,而在MySQL 5.5中上限是1000字節。因此,當使用組合索引時,MySQL 8.0允許更多的列參與索引。
2、自適應哈希索引
MySQL 8.0引入了自適應哈希索引的概念,可用于快速過濾非常大的數據集,以提高查詢的性能。自適應哈希索引不同于B樹索引,它只維護哈希表,而不是維護排序和平衡的樹結構。自適應哈希索引的實現依賴于整個數據集的分析,MySQL可以自動選擇是否使用自適應哈希索引來優化特定的查詢。
3、JSON索引
MySQL 8.0支持為JSON列創建索引,這使得可以更有效地查詢JSON結構的數據。在MySQL 5.5中,必須將JSON數據存儲在文本列中,才能進行索引。
4、覆蓋索引支持的列不同
MySQL 8.0支持覆蓋索引所有被查詢的列,不需要從磁盤上讀取數據行。這可以提高查詢的性能,并降低磁盤I/O操作的數量。但在MySQL 5.5中,只有被查詢到達的列會被包含在覆蓋索引中。
二、mysql8.0的新特性
1、數據字典
MySQL 8.0包含一個事務數據字典,用于存儲有關數據庫對象的信息。在MySQL8.0之前的版本中,字典數據存儲在元數據文件和非事務表中。
2、原子數據定義語句
MySQL 8.0支持原子數據定義語言(DDL)語句。此功能稱為原子DDL。原子DDL語句將與DDL操作關聯的數據字典更新,存儲引擎操作和二進制日志寫入組合到單個原子事務中。即使服務器在操作期間暫停,也會提交事務,并將適用的更改保留到數據字典、存儲引擎和二進制日志,或者回滾事務。通過在MySQL 8.0中引入MySQL數據字典,可以實現原子DDL。在早期的MySQL版本中,元數據存儲在元數據文件、非事務性表和存儲引擎特定的字典中,需要中間提交。MySQL數據字典提供的集中式事務元數據存儲消除了這一障礙,使得將DDL語句操作重組為原子事務成為可能。
3、安全和賬戶管理
MySQL 8.0通過以下功能增強數據庫的安全性,并在賬戶管理中實現更高的DBA靈活性。MySQL數據庫的授權表統一為InnoDB(事務性)表。每個語句都是事務性的,并且對所有創建的用戶都是成功或者回滾,發生任何錯誤都無效。如果成功,就將語句寫入二進制日志;如果失敗則不寫入,發生回滾并且不進行任何更改。
MySQL 8.0開始支持角色,角色可以看成是一些權限的集合,為用戶賦予統一的角色,權限的修改直接通過角色來進行,無須為每個用戶單獨授權。管理員可以創建和刪除角色。MySQL 8.0開始維護有關密碼歷史的信息,從而限制了以前密碼的重用。管理員可以在全局以及每個賬戶的基礎上建立密碼重用策略,從而在密碼更改時限制使用以前使用過的密碼。MySQL 8.0允許賬戶具有雙密碼,從而在多服務器系統中無縫地執行分階段密碼更改,無須停機。4、資源管理
MySQL現在支持資源組的創建和管理,并允許將服務器內運行的線程分配給特定的資源組。資源組屬性可以控制其資源,以啟用或限制資源組中線程的資源消耗。數據庫管理員可以根據不同的工作負載修改這些屬性。
5、InnoDB增強功能
MySQL 8.0增強了InnoDB的功能,主要表現如下:
MySQL 8.0將自增主鍵的計數器持久化到重做日志中。每次計數器發生改變,都會將其寫入重做日志中。如果數據庫重啟,InnoDB會根據重做日志中的信息來初始化計數器的內存值。為了盡量減小對系統性能的影響,計數器寫入重做日志時,并不會馬上刷新數據庫系統。如果索引損壞,InnoDB將索引損壞標志寫入重做日志,從而使得損壞標志安全。InnoDB還將內存中損壞標志數據寫入每個檢查點上的引擎專用系統表。在恢復期間,InnoDB從兩個位置讀取損壞標志并在將內存表和索引對象標記為損壞之前合并結果。新的動態變量innodb_deadlock_detect可用于禁用死鎖檢測。在高并發系統上,當許多線程等待同一個鎖時,死鎖檢測會導致速度減慢,此時禁用死鎖檢測可能更有效。6、字符集支持
默認字符集已經更改latin1為utf8mb4。該utf8mb4字符集有幾個新的排序規則,其中包括utf8mb4_ja_0900_as_cs。
7、增強JSON功能
MySQL增強JSON功能主要表現在以下幾個方面:
添加了->>運算符,相當于調用JSON_UNQUOTE()的結果。添加了兩個JSON聚合函數JSON_ARRAYAGG()和JSON_OBJECTAGG()。JSON_ARRAYAGG()將列或表達式作為其參數,并將結果聚合為單個JSON數組。JSON_OBJECTAGG()取兩個列或表達式,將其解釋為鍵和值,并將結果作為單個JSON對象返回。添加了JSON實用程序功能JSON_PRETTY(),JSON以易于閱讀的格式輸出現有值;每個JSON對象成員或數組值都打印在一個單獨的行上,子對象或數組相對于其父對象是2個空格。添加的JSON_MERGE_PATCH()可以合并符合RFC 7396標準的JSON。在兩個JSON對象上使用時,可以將它們合并為單個JSON對象。8、數據類型的支持
MySQL 8.0支持將表達式用作數據類型的默認值,包括BLOB、TEXT、GEOMETRY和JSON數據類型,在以前的版本中是根本不會被分配默認值的。
9、查詢的優化
MySQL 8.0在查詢方面的優化表現如下:
MySQL 8.0開始支持不可見索引。優化器根本不使用不可見索引,但會以其他方式正常維護。默認情況下,索引是可見的。通過不可見索引,數據庫管理員可以檢測索引對查詢性能的影響,而不會進行破壞性的更改。MySQL8.0開始支持降序索引。DESC在索引定義中不再被忽略,而且會降序存儲索引字段。10、公用表表達式
MySQL現在支持非遞歸和遞歸的公用表表達式。公用表表達式允許使用命名的臨時結果集,通過允許WITH語句之前的子句SELECT和某些其他語句來實現。
11、窗口函數
在MySQL 8.0版本中,新增了一個窗口函數,用它可以實現很多新的查詢方式。窗口函數類似于SUM()、COUNT()那樣的集合函數,但它并不會將多行查詢結果合并為一行,而是將結果放回多行當中。
12、統計直方圖
MySQL 8.0實現了統計直方圖。利用直方圖,用戶可以對一張表的一列做數據分布的統計,特別是針對沒有索引的字段。這可以幫助查詢優化器找到更優的執行計劃。
13、備份鎖
新類型的備份鎖在聯機備份期間允許DML,同時防止可能導致快照不一致的操作。新的備份鎖由LOCK INSTANCE FOR BACKUP和UNLOCK INSTANCE語法支持。管理員擁有BACKUP_ADMIN權限才能使用這些語句。
延伸閱讀1:MySQL
MySQL是一個關系型數據庫管理系統,由瑞典MySQL AB 公司開發,屬于 Oracle 旗下產品。MySQL 是最流行的關系型數據庫管理系統之一,在 WEB 應用方面,MySQL是較好的 RDBMS (Relational Database Management System,關系數據庫管理系統) 應用軟件之一。MySQL是一種關系型數據庫管理系統,關系數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度并提高了靈活性。