Oracle放大招:MySQL 即將支持 Hash Join

2021-12-25 數據和雲

在剛剛OOW19會上的《python and mysql 8.0 document store》topic中,終於看到了MySQL即將在8.0.18中支持hash join,自從被Oracle收購後,又一特性被引入到MySQL中,有了Hash Join,SQL的性能將得到顯著的提升,同學們期盼已久,迫不及待的等待測試,BTW:Oracle資料庫在1996年7.3版本中就已經推出了hash join功能。

Topic中給出了MySQL Hash Join的特性介紹:

1、對於大數據量的表關聯,HJ速度將明顯比NL快很多

2、在內存中處理

3、必要情況下,會使用磁碟空間

4、用於內連接,可擴展到外連接、半連接和反連接

5、替換查詢計劃中的Block Nested Loop

6、可以通過HINT強制SQL走HJ或者NL

MySQL是一個輕量級的資料庫,使用起來非常簡單,深受開發者喜愛。之所以一直不支持hash join,想必應該是背後的邏輯和數據支撐需要較高開發和維護成本,hash join算法其實並不複雜,但是要想hash join運行好,類似Oracle CBO一整套的東西是必不可少的,而CBO又依賴於統計信息,隨之而來的就是Oracle中常見的謂詞越界、數據分布不均、綁定變量窺探等等問題需要解決。

我們從後面看到,MySQL 8.0.18還支持EXPLAIN ANALYZE,也是基於CBO的一些新功能

使用它可以估算成本、查看實際執行的統計數據,包括第一條記錄的返回時間,全部記錄返回時間,返回記錄的數量以及循環數量,EXPLAIN還將可以使用新的輸出格式,樹狀輸出。

隨著企業數據量的增長,不再是幾年前幾十M大小隨便跑的資料庫了,期待MySQL在更多的場景都能發揮作用。

出處:墨天輪(https://www.modb.pro/db/6589,複製到網頁中打開或者點擊「閱讀原文」)

DBASK,DBA的即時問答平臺


長按,識別二維碼,加入萬人交流社群

請備註:雲和恩墨大講堂

相關焦點

  • MySQL 8.0 新特性:哈希連接(Hash Join)
    https://dev.mysql.com/doc/refman/8.0/en/hash-joins.htmlMySQL 實現了用於內連接查詢的 hash join 方式。例如,從 MySQL 8.0.18 開始以下查詢可以使用 hash join 進行連接查詢:SELECT *     FROM t1     JOIN t2         ON t1.c1=t2.c1;Hash join 不需要索引的支持。
  • MySQL 8.0 新特性:引人注目的哈希連接(Hash Join)
    其中最引人注目的莫過於多表連接查詢支持 hash join 方式了。我們先來看看官方的描述:https://dev.mysql.com/doc/refman/8.0/en/hash-joins.htmlMySQL 實現了用於內連接查詢的 hash join 方式。
  • MySQL 8.0 新特性之Hash Join
    詳細的HashJoin的過程可參考MySQL官方博客:https://mysqlserverteam.com/hash-join-in-mysql-8/從MYSQL 8.0.18開始,MYSQL實現了對於相等條件下的HashJoin,並且,join條件中無法使用任何索引,比如下面的語句:當然,如果有一個或者多個索引可以適用於單表謂詞,hash join也可以使用到
  • 【譯】Oracle調優技巧22:Hash Outer Join
    然而在 Hash outer join 中,這個決策過程變得無關緊要,因為默認情況下父表會被選為hash表,而不管它是小表還是大表。原因是連接條件(joining condition)將決定哪個表將成為此 Hash outer join 中的 hash 表,而不是cost , 後者是用於標識 hash equi-join中hash表的度量。
  • 我想說:mysql的join 真的很弱
    最後我會在oracle資料庫上執行上述語句。 對比1.1 和5.1 步驟sql查詢,4表連接,對我本機mysql來說 ,1.5千萬數據查詢很流利,是一個mysql數據量流利分水嶺。(這個只是現象,不太準確,需要同時計算表的容量)。 步驟5.1對比6.1,6.2,6.3,多表join對mysql來說,處理有些吃力。
  • 我想說:mysql 的 join 真的很弱
    對比1.1 和5.1 步驟sql查詢,4表連接,對我本機mysql來說 ,1.5千萬數據查詢很流利,是一個mysql數據量流利分水嶺。(這個只是現象,不太準確,需要同時計算表的容量)。步驟5.1對比6.1,6.2,6.3,多表join對mysql來說,處理有些吃力。 超過三張表禁止join,這個規則是針對mysql來說的。
  • 如何將Oracle遷移至mysql?
    1)下載Navicat Premium版本,Navicat for mysql只支持連接mysql資料庫。如果需要支持oracle連接,還需要配置OCI,選擇工具—選項—OCI,選擇對應路徑下文件:配置完成後關閉Navicat再重新打開。
  • mysql和oracle語法異同
    一、mysql裡的ifnull(a,b)對應oracle的nvl(a,b);二、日期比較:mysql: 可以用Date類型的日期進行比較時間比較。oracle:必須用to_date()函數和to_char()函數配合轉換成統一格式的日期字符串,然後進行比較。
  • 聊聊oracle+hint 的使用
    oracle也會犯犯傻,會幫我們選擇非常不好的執行計劃,這個時候就需要我們來手工的優化優化,幫助oracle 提高下運行效率。例如有兩個表TABLE_A和TABLE_B,想讓這兩個表關聯的時候以hash_join、nest loop、merge join的方式進行關聯,就可以這樣寫:Select /*+use_hash(a,b)*/ * from table_a a,table_b b where a.id=b.id;Select /*+use_nl(a,b)*/ * from table_a
  • R語言:資料庫連接:oracle、mysql及hive
    dbConnect(jdbcDriver,"jdbc:oracle:thin:@//172.35.28.75:1521/bigdata",                  "well","well2")包加載完成後需要使用JDBC函數指定一個jdbc驅動,第一個參數用於指定驅動的類型,這裡是連接的oracle就是指定oracle類型,參數classPath用於指定驅動存放的路徑
  • 阿里規定超過三張表禁止JOIN,為啥呢?
    最後我會在oracle資料庫上執行上述語句。 4、對比1.1 和5.1 步驟sql查詢,4表連接,對我本機mysql來說 ,1.5千萬數據查詢很流利,是一個mysql數據量流利分水嶺。(這個只是現象,不太準確,需要同時計算表的容量)。 5、步驟5.1對比6.1,6.2,6.3,多表join對mysql來說,處理有些吃力。
  • Oracle DBLINK MySQL實施步驟
    上周由於業務需要在Oracle資料庫中直接操作mysql資料庫,特意研究一下:8.執行: tar -zxvf mysql-connector-odbc-5.2.5-linux-glibc2.5-x86-64bit.tar.gz9.配置odbc.ini文件10.測試ODBC連接:運行命令: isql testdb -v
  • MySQL 的 join 功能弱了?
    join 是在數據領域中十分常見的將兩個數據集進行合併的操作,如果大家了解的多的話,會發現 MySQL,Oracle,PostgreSQL 和 Spark 都支持該操作。本篇文章的主角是 MySQL,下文沒有特別說明的話,就是以 MySQL 的 join 為主語。
  • MySQL 的 join 功能弱爆了?
    join 是在數據領域中十分常見的將兩個數據集進行合併的操作,如果大家了解的多的話,會發現 MySQL,Oracle,PostgreSQL 和 Spark 都支持該操作。本篇文章的主角是 MySQL,下文沒有特別說明的話,就是以 MySQL 的 join 為主語。
  • 阿里: 規定超過3張表禁止JOIN?
    最後我會在oracle資料庫上執行上述語句。此時說明mysql查詢有些吃力了,但是仍然嫩查詢出來。3、步驟5.1,mysql查詢不出來,4表連接,對我本機mysql來說,1.5億數據超過極限了(我調優過這個SQL,執行計劃和索引都走了,沒有問題,show profile顯示在sending data.這個問題另外文章詳談。)
  • MySQL:Left Join 避坑指南
    在我們使用mysql查詢的過程中可謂非常常見,比如博客裡一篇文章有多少條評論、商城裡一個貨物有多少評論、一條評論有多少個贊等等。答案是兩個需求都是第一條語句是正確的,要搞清楚這個問題,就得明白mysql對於left join的執行原理,下節進行展開。
  • 資料庫篇——hash索引
    select * from table1 right join table2 on (table1.id=table2.table1_id) where table2hash索引的時間複雜度與空間複雜度hash索引每次查找元素的時間複雜度約等於O(1),實際的時間複雜的與數據的hash衝突率有關。
  • MySQL:left join 避坑指南
    現象left join在我們使用mysql查詢的過程中可謂非常常見,比如博客裡一篇文章有多少條評論、商城裡一個貨物有多少評論、一條評論有多少個贊等等。但是由於對join、on、where等關鍵字的不熟悉,有時候會導致查詢結果與預期不符,所以今天我就來總結一下,一起避坑。
  • MySQL:LEFT JOIN 避坑指南
    在我們使用mysql查詢的過程中可謂非常常見,比如博客裡一篇文章有多少條評論、商城裡一個貨物有多少評論、一條評論有多少個贊等等。~~~~~~~~~~~~~~~~答案是兩個需求都是第一條語句是正確的,要搞清楚這個問題,就得明白mysql對於left join的執行原理,下節進行展開。
  • MySQL與oracle資料庫的一些區別
    【IT168 技術】1、 組函數用法規則  mysql中組函數在select語句中可以隨意使用,但在oracle中 如果查詢語句中有組函數,那其他列名必須是組函數處理過的,或者是group by子句中的列 否則報錯。