這篇文章給大家分享的是有關MySQL中hash join有什么用的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
成都創(chuàng)新互聯(lián)專注于富川網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供富川營銷型網(wǎng)站建設,富川網(wǎng)站制作、富川網(wǎng)頁設計、富川網(wǎng)站官網(wǎng)定制、重慶小程序開發(fā)公司服務,打造富川網(wǎng)絡公司原創(chuàng)品牌,更為您提供富川網(wǎng)站排名全網(wǎng)營銷落地服務。
MYSQL 的多表聯(lián)合查詢中,只有nest loop 的查詢方式,讓MYSQL 一致是被“嘲笑”的地方。MYSQL 8.018 后mysql 將擁有HASH JOIN 功能,雖然對比其他數(shù)據(jù)庫來說,這并不新鮮,但對于MYSQL 算是劃時代的里程碑。
原理之類的先不說,先看效果。建立兩個存儲過程,為C1 表和 C2表插入測試數(shù)據(jù)
delimiter //
CREATE PROCEDURE insert_c1()
BEGIN
DECLARE i int ;
DECLARE a varchar(20) ;
DECLARE b smallint ;
set i = 1;
begin
WHILE i<=1000000 do
set b = FLOOR(rand()*50);
if i mod 2 = 0 then
set a = 'good';
elseif i mod 3 = 0 then
set a = 'excellent';
elseif i mod 5 = 0 then
set a = 'ordinary';
elseif i mod 4 = 0 then
set a = 'worsen';
else
set a = 'improvement';
end if;
if b < 20 then
set b = b + 15;
end if;
INSERT into test.status(status,score) values (a,b);
set i = i + 1;
END WHILE;
end;
END
//
兩個表結構是一樣的
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`c1` varchar(20) DEFAULT NULL,
`c2` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_c1` (`c1`)
) ENGINE=InnoDB
從圖中可以清晰的看到查詢已經(jīng)走了hash join,那老的MYSQL DBA 可能會提出一個問題,到底這個hash join 比 nest loop 能好多少,可別和MYSQL 8 VS MYSQL 5.7一樣,誰快還不一定。下面做了一個對比,可以清晰的看到在某些情況下,HASH JOIN 在沒有索引的情況下,比添加了索引的NEST LOOP 的速度要快了一倍。
所以到這里,
1 hash join 的確是查詢中需要的功能
2 hash join 的確在某些情況下 比 NEST LOOP 要快
在說明完這些問題后,我們的講講為什么
在MYSQL 中hash join的構造包含兩個流程 1 build 2 probe
1建立的階段就是將需要進行JOIN 的字段,進行一個HASH 值的計算,而到底哪個表要進行這樣的計算,整體SIZE 小的表將被選中,在內存中構建這個計算好值的表
2 匹配的過程,從另外一個表中將字段的值進行計算,與內存中的值匹配的就被選中,否則就拋棄。
這樣操作的好處也是顯而易見的,大大縮減比對的次數(shù)
NEST LOOP 如果是 N * S 則 hash join 可以比對為N * distinct S 如果distinct S 變化的值越少,則表的查詢速度越快。
當然這樣還會產生另一個結果,就是我們可以在某些時候放棄JOIN 中建立索引了,如果建立了索引,則MYSQL 會傾向使用 NEST LOOP ,而不走HASH JOIN ,所以到了8.018 這個版本后,MYSQL 的查詢優(yōu)化,可能又要添加一條想法了。
當然如果想要這個功能,首先先查查你的數(shù)據(jù)庫目前支持,或打開了這個功能沒有。
那hash joinj就無敵了,哪里都能用 NO NO NO 要使用它是有限制的,我們下面吧索引刪除
下面的查詢看似和上面的差不多,但就是沒有走HASH JOIN
所以需要記住三個地方是是否能使用HASH JOIN 的前提
1 沒有索引
2 等值運算
3 INNER JOIN
感謝各位的閱讀!關于“MYSQL中hash join有什么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
網(wǎng)頁名稱:MYSQL中hashjoin有什么用
網(wǎng)頁URL:http://www.rwnh.cn/article44/ipcehe.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供手機網(wǎng)站建設、ChatGPT、App設計、面包屑導航、網(wǎng)站設計公司、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)