<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
GreatSQL社群原創內容未經授權不得隨意使用,轉載請聯絡小編並註明來源。GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。
資料庫的優化器相當於人類的大腦,大部分時候都能做出正確的決策,制定正確的執行計劃,走出一條高效的路,但是它畢竟是基於某些固定的規則、演演算法來做的判斷,有時候並沒有我們人腦思維靈活,當我們確定優化器選擇執行計劃錯誤時該怎麼辦呢,語句上加hint,提示它選擇哪條路是一種常見的優化方法。
我們知道Oracle提供了比較靈活的hint提示來指示優化器在多表連線時選擇哪種表連線方式,比如use_nl
,no_use_nl
控制是否使用Nest Loop Join,use_hash
,no_use_hash
控制是否使用hash join。
但是MySQL長期以來只有一種表連線方式,那就是Nest Loop Join
,直到MySQL8.0.18版本才出現了hash join, 所以MySQL在控制表連線方式上沒有提供那麼多豐富的hint給我們使用,hash_join
與no_hash_join
的hint只是驚鴻一瞥,只在8.0.18版本存在,8.0.19及後面的版本又將這個hint給廢棄了,那如果我們想讓兩個表做hash join該怎麼辦呢?
我們來以MySQL8.0.25的單機環境做一個實驗。建兩個表,分別插入10000行資料,使用主鍵做這兩個表的關聯查詢。
create table t1(id int primary key,c1 int,c2 int); create table t2(id int primary key,c1 int,c2 int); delimiter // CREATE PROCEDURE p_test() BEGIN declare i int; set i=1; while i<10001 do insert into t1 values(i,i,i); insert into t2 values(i,i,i); SET i = i + 1; end while; END; // delimiter ;
查詢一下兩表使用主鍵欄位關聯查詢時實際的執行計劃,如下圖所示:
查詢一下兩表使用非索引欄位關聯查詢時實際的執行計劃,如下圖所示:
從執行計劃可以看出,被驅動表的關聯欄位上有索引,優化器在選擇表連線方式時會傾向於選擇Nest Loop Join,當沒有可用索引時傾向於選擇hash join。
基於這一點那我們可以使用no_index
提示來禁止語句使用關聯欄位的索引。
從上面的執行計劃可以看出使用no_index提示後,優化器選擇了使用hash join。
當索引的選擇性不好時,優化器選擇使用索引做Nest Loop Join是效率是很低的。
我們將實驗的兩個表中c1列的資料做一下更改,使其選擇性變差,並在c1列上建普通索引。
update t1 set c1=1 where id<5000; update t2 set c1=1 where id<5000; create index idx_t1 on t1(c1); create index idx_t2 on t2(c1);
當我們執行sql :
select t1.*,t2.* from t1 join t2 on t1.c1=t2.c1;
這個查詢結果會返回大量資料,被驅動表的關聯欄位c1列的索引選擇性差,此時選擇hash join是更明智的選擇,但是優化器會選擇走Nest Loop Join。我們可以通過實驗驗證一下hash join 與 Nest Loop Join的效能差異。
可以看出使用hash join的耗時是使用Nest Loop Join的1/6,但是優化器根據成本估算時,使用Nest Loop Join的成本要比使用hash join的成本低很多,所以會去選擇Nest Loop Join,這個時候就需要加上hint 提示禁止使用關聯欄位的索引,被驅動表上每次都全表掃描的代價是很高的,這樣優化器估算後就會選擇走hash join。
MySQL官方檔案裡提到用BNL
,NO_BNL
的hint提示來影響hash join的優化,但是經過實驗證明,在表連線關聯欄位上沒有可用索引時,優化器估算成本後不會對被驅動表使用BNL全表掃描的方式做巢狀迴圈連線,而是會選擇使用hash join,那這樣NO_BNL在這個場景下就沒有用武之地了。
那麼既然不用這個索引,把這個索引去掉不就可以了嗎?為什麼非要使用no_index的hint提示呢,我們要知道業務使用的場景何其多,此處不用,別處使用了這個索引效率可能會有大的提升啊,這個時候就凸顯了hint的優勢,只需要控制此語句的使用就好了。
Nest Loop Join有其優勢,它是response最快的連線方式,適用於返回資料量小的場景。當兩個大表連線,返回大量資料,且關聯欄位的索引比較低效時,使用hash join就會比較高效,我們可以使用no_index的hint提示禁用關聯欄位的低效索引,促使優化器選擇hash join。
到此這篇關於MySQL優化器使用hash join的的文章就介紹到這了,更多相關MySQL優化器使用hash join內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45