1. 功能
NoSQL支持:
MySQL 從 5.7 版本開始提供 NoSQL 存儲功能奸远,在 8.0 版本中這部分功能也得到了更大的改進(jìn)澡屡。
JSON:
MySQL 8 大幅改進(jìn)了對 JSON 的支持匾荆,添加了基于路徑查詢參數(shù)從 JSON 字段中抽取數(shù)據(jù)的 JSON_EXTRACT() 函數(shù),以及用于將數(shù)據(jù)分別組合到 JSON 數(shù)組和對象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函數(shù)。
窗口函數(shù):
從 MySQL 8.0 開始晃虫,新增了一個叫窗口函數(shù)的概念,它可以用來實(shí)現(xiàn)若干新的查詢方式扣墩。
窗口函數(shù)與 SUM()哲银、COUNT() 這種集合函數(shù)類似,但它不會將多行查詢結(jié)果合并為一行呻惕,而是將結(jié)果放回多行當(dāng)中荆责。即窗口函數(shù)不需要 GROUP BY。
隱藏索引:
在 MySQL 8.0 中亚脆,索引可以被“隱藏”和“顯示”做院。當(dāng)對索引進(jìn)行隱藏時,它不會被查詢優(yōu)化器所使用濒持,我們可以使用這個特性用于性能調(diào)試键耕。
在創(chuàng)建完索引后,我們先將其隱藏柑营,然后觀察其對數(shù)據(jù)庫的影響屈雄。如果數(shù)據(jù)庫性能有所下降,說明這個索引是有用的官套,然后將其“恢復(fù)顯示”即可酒奶。如果數(shù)據(jù)庫性能看不出變化蚁孔,說明這個索引是多余的,可以考慮刪掉惋嚎。
降序索引:
MySQL 8.0 為索引提供按降序方式進(jìn)行排序的支持杠氢,在這種索引中的值也會按降序的方式進(jìn)行排序。
通用表表達(dá)式式(Common Table Expressions CTE):
在復(fù)雜的查詢中使用嵌入式表時瘸彤,使用 CTE 使得查詢語句更清晰修然。
UTF-8 編碼:
從 MySQL 8 開始,使用 utf8mb4 作為 MySQL 的默認(rèn)字符集质况。
支持表 DDL 的原子性:
InnoDB 現(xiàn)在支持表 DDL 的原子性,也就是 InnoDB 表上的 DDL 也可以實(shí)現(xiàn)事務(wù)完整性玻靡,要么失敗回滾结榄,要么成功提交,不至于出現(xiàn) DDL 時部分成功的問題囤捻,此外還支持 crash-safe 特性臼朗,元數(shù)據(jù)存儲在單個事務(wù)數(shù)據(jù)字典中。
支持 crash-safe 特性:
元數(shù)據(jù)存儲在單個事務(wù)數(shù)據(jù)字典中蝎土。
高可用性:
InnoDB 集群為數(shù)據(jù)庫提供集成的原生 HA 解決方案视哑。
caching_sha2_password 身份驗(yàn)證插件:
caching_sha2_password是MySQL 8.0中的默認(rèn)身份驗(yàn)證插件,替換了mysql 5.7的mysql_native_password誊涯,身份驗(yàn)證安全性能提升挡毅。
授權(quán)
與帳戶管理相關(guān)的授權(quán)語法略有差異:
MySQL5.7創(chuàng)建用戶和用戶授權(quán)命令可以同時執(zhí)行
grant all privileges on . to 'Gary'@'%' identified by 'Gary@2019'
MySQL8.0創(chuàng)建用戶和用戶授權(quán)的命令需要分開執(zhí)行
創(chuàng)建用戶
create user 'Gary'@'%' identified by 'Gary@2019';
用戶授權(quán)【給予所有權(quán)限】
grant all privileges on . to 'Gary'@'%'
2. 性能:
根據(jù)官方說法,MySQL 8 要比 MySQL 5.7 快 2 倍暴构。
性能提升主要集中在三個領(lǐng)域:
- 讀寫工作負(fù)載
- I/O密集型工作負(fù)載
- 熱點(diǎn)競爭問題工作負(fù)載跪呈。
以下幾張圖,是騰訊團(tuán)隊(duì)測試的MySQL 5.7 與 8.0 的對比分析數(shù)據(jù)取逾,可以作為參考耗绿。
當(dāng)線程數(shù)量增加時,MySQL 8.0明顯優(yōu)于MySQL 5.7砾隅!
降序索引
MySQL 8.0 降序索引 避免了“filesort”误阻,顯著提升了讀取性能。
在8.0版本中晴埂,影響MySQL讀取性能的重要新增支持是:可以按降序(或正向索引掃描)創(chuàng)建索引的能力究反。從語法上,MySQL 4就支持了降序索引邑时,但正如官方文檔所言奴紧,"they are parsed but ignored",實(shí)際創(chuàng)建的還是升序索引晶丘。
以前的版本只有升序或 反向索引掃描黍氮,如果需要降序唐含,MySQL必須執(zhí)行filesort(如果需要filesort,需要檢查max_length_for_sort_data的值)沫浆。當(dāng)最有效的掃描順序混合某些列的升序和其他列的降序時捷枯,降序索引還使優(yōu)化器可以使用多列索引。
如果只對單個列進(jìn)行排序专执,降序索引的意義不是太大淮捆,無論是升序還是降序,升序索引完全可以應(yīng)付本股。如果一個查詢攀痊,需要對多個列進(jìn)行排序,且順序要求不一致拄显。在這種場景下苟径,要想避免數(shù)據(jù)庫額外的排序-“filesort”,最好的方法就是使用降序索引躬审。
避免隱式排序
由于降序索引的引入棘街,MySQL 8.0再也不會對group by操作進(jìn)行隱式排序。