MySQL 8.0來了,看看有哪些真香特性
MySQL被Sun收購后,搞了個過渡的6.0版本,沒多久就下線了(有一次居然聽說有人在線上用6.0版本,我驚得下巴都掉了)。被Oracle收購后,終于迎來了像樣的5.6版本,之后就是5.7、8.0版本。這么看來,Sun的衰亡不無道理。
P.S,上面說了6.0版本號已被用過,7.x系列版本專用于NDB Cluster,因而新版本號從8.0開始。
剛被Oracle收購時,大家恐慌的不行,貌似還甚至搞了個聯合簽名請愿活動來著,可惜真的是應了那句話“天下大勢,浩浩湯湯,順之者昌,逆之者亡”。
創始人Monty又折騰了MariaDB,可惜也是不溫不火的。MySQL 8.0發布后,MariaDB宣布不打算繼續合并InnoDB引擎,這下就更尷尬了,以后還能愉快的玩耍了嗎?這兩年Monty老先生還時不時來中國露個臉,但似乎有那么一丟丟變味了。
閑話少說,一起來看看8.0都有哪些真香特性吧。
1. 為什么是8.0
作為迄今為止,地表最強的MySQL版本,8.0被寄予厚望。
雖然在很多人眼里,MySQL 8.0無非是有個"好爹",很多新特性是照著Oracle"抄"的。但在我看來,Oracle作為先驅前輩,已經證明了這些技術的優秀之處,有什么理由不借鑒呢,難道非要折騰出一些只為了能自嗨的莫名其妙的特性才叫牛逼,比如只能用觸發器變相實現的表分區功能的某DB?
再說了,即便有個”好爹“,就一定能做好嗎,國民老公不也被限制消費了?
MySQL 8.0無論在功能還是性能(整體上),都是目前最好的MySQL版本。以往因為某些特性不支持,導致需要在業務代碼、邏輯上做一些妥協,甚至增加使用第三方解決方案(例如NOSQL)。
我相信從8.0開始,以后這種情況會越來越少的,MySQL會越來越好,絕大多數和數據庫相關的業務需求,都能在MySQL中完成。當然了,我也相信它不會為了嘩眾取寵,堆砌一些無謂的功能,變成另一個“最好用”的數據庫。
2. MySQL 8.0哪里香
截止本文發稿,MySQL最新版本是8.0.19。下面是站在我個人角度上,認為最香的幾個特性。
2.1 性能優化相關
無疑是hash join。相信DBA們被弱雞開發坑怕了,有了hash join再也不那么怕沒索引的多表join了。還有一個,anti join。hash join剛出來時,我做了個簡單的測試,當時也發了過朋友圈:



- 快速加新列。做過游戲DBA的我簡直熱淚盈眶,想想以前早起做變更的苦逼歲月(╥╯^╰╥)
- 直方圖。沒有索引,不想建索引,索引不準確?不怕,還有直方圖兜底。
- 函數索引、表達式索引,開發者們該愛死這兩個功能了吧。
- 消除了全局的buffer pool mutex。話說這個特性Percona好像在5.5版本就有了,官方團隊在這塊的動作慢的有點厲害啊。
- 倒序索引。任你正序排,倒序排,還是混合順序排,啥姿勢都能滿足,em...
- 不可見索引。刪個索引,想刪又不太敢動手,怎么破?不可見索引來救命。改為不可見后,觀察一陣子,確認沒影響了再放心刪除吧。
- 引入WRITESET模式,大大提高并行復制效率,主從復制延遲進一步縮小。
- 針對JSON數據類型,增加Multi-valued indexes,更方便JSON的搜索了。
- HINT語法增強,更方便在執行查詢時動態設定選項,針對不同SQL采用不同策略。
- 有個新的TempTable引擎,比原來的tmptable強不少。
- 其他優化。
2.2 管理、復制、安全方面的功能提升
- 正式推出Group Relication。很好,在穩步朝著高性能、高可用方向推進,先實現讀可擴展,再實現寫可擴展。期待不遠的將來再實現分布式Sharding,到那時候,現在市面上那些吹得不可一世的NEWSQL們該啞火了,這兩年有點憋屈的說。
- Clone Plugin以及ReplicaSet特性,配合MySQL Shell,想要部署一個新的slave實例,或者是InnoDB Cluster節點,就方便很多了。
- sqlrequireprimary_key選項設定強制要求每個表都得有個主鍵。在主從環境中,相信太多人吃過沒主鍵的虧了。當然了,我并沒有,嘿。
- 實例重啟后的自增ID持久化,小增強卻解決了業務上的邏輯大麻煩。
- extra admin port,管理員可以給自己開后門了。
- 在線修改完配置參數后,SET PERSIST語法實現持久化,不用再手工修改一次my.cnf了。
- 鎖增強,增加SKIP LOCK、NOWAIT LOCK鎖模式,以及BACKUP LOCk。
- 窗口函數、CTE。做統計分析同學的福音。
- 其他提升。
更多的特性,可以訪問下面幾個資料查看。
- MySQL 8.0新特性
- MySQL 8.0相對于5.7的復制改進
- 從MySQL5.5到MySQL8.0子查詢進化之路
3. 看完了還不想上車?
細心的讀者,或許能發現在官方文檔第一章"Chapter 1 General Information"里頭,有這么一段話:
- Support for setting user variables in statements other than
- SET was deprecated in MySQL 8.0.13. This functionality is
- subject to removal in MySQL 9.0.
嗯,你沒看錯,是的,下一個就是9.0版本,按照經驗,2020年也應該要發布了。
再吼一下,MySQL 8.0來了,高鐵般的速度,再不上車您就直接用9.0吧。