MYSQL 8 VS MYSQL 5.7 在複雜查詢中 到底好了多少

  • 2020 年 2 月 24 日
  • 筆記

MySQL 8 最終是要大面積替換MYSQL5.7 , 之前的文字可能給人感覺MYSQL 8 還不如 MYSQL 5.7 ,實際上不然,任何東西新的一定有問題,解決解決就好了,在複雜查詢這塊 MYSQL 5.7 的確是和MYSQL 8 已經有了分別,對於開發人員撰寫SQL 有什麼幫助我們可以看看下面的一些例子。

下面是MYSQL 8 和 MYSQL 5.7 在一個稍微複雜查詢的執行計劃

對比上面的圖,一樣的語句,一樣的數據庫,一樣的表,一樣的數據行數和內容,mysql 8 由於各種優化,去掉了 using firesort,並且由於這一項,節省了近 20秒

下面還有相關的例子,還是出了MYSQL 版本不一致,包括硬件其他的都一樣的情況下,mysql 8 比 mysql 5.7 要快 4倍 34秒與128秒的區別,不同的還是那個 filesort

mysql 8.018

mysql 5.7.23

通過這兩個例子可以看到,在使用GROUP BY 這樣的語句,在沒有特殊優化的情況下,,MYSQL 8 不在使用 FILESORT 排序後,速度有了大幅度的提升,這說明在沒有優化的情況下,MYSQL 8 對於排序和GROUP BY 這樣的查詢時有利的,並且隨着提取的數據越多,則越快,這對 DEVELOPER 是一個好消息。

MYSQL 8

MySQL 5.7

上面的測試中,如果不帶有Join salaries 的情況下,實際情況是MYSQL 5,7 還會稍微的好一些,MYSQL 8 會將not exists not in 裏面的子查詢先 Materialized 一下,相對來說,如果 not exists not in 裏面的要排除的數據越少越好,條件越精準越好,這樣MYSQL 8 的 antijoin 的功能就會能幫助查詢更有效的排除數據。這裡在所有都一樣的情況下,MYSQL 8 比 MYSQL 5.7 快 2倍的時間。

當然也有一些差強人意的,下面的兩個查詢時間上基本相同,可能需要更多的將語句重新格式的時間,mysql 8 還慢了0.2秒

MYSQL 8

總體來說mysql 在hash join , 免filesort 的新功能對大部分查詢語句是有幫助的,但實際上在測試中有些簡單的語句,MYSQL 8 並不能佔據什麼便宜,或者說還可能會比MYSQL 5.7 慢了「一眨眼」 的功夫。

最後總結一下,

如果當前MYSQL 5.X 中運行的系統邏輯並不複雜,執行的語句都是簡單的,那換了MYSQL 8 可能並不能得到什麼好處,甚至會「挨罵」。

而如果本身就是從其他數據庫遷移過來的系統,語句寫的比較「水」,則更換MYSQL 8 會讓一些SQL 跑的好看一些, 期待MYSQL 也能並行查詢。