成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

MySQL優(yōu)化器hash?join怎么使用

今天小編給大家分享一下MySQL優(yōu)化器hash join怎么使用的相關(guān)知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站建設、網(wǎng)站制作與策劃設計,江山網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設10年,網(wǎng)設計領(lǐng)域的專業(yè)建站公司;建站業(yè)務涵蓋:江山等地區(qū)。江山做網(wǎng)站價格咨詢:18982081108

前言

數(shù)據(jù)庫的優(yōu)化器相當于人類的大腦,大部分時候都能做出正確的決策,制定正確的執(zhí)行計劃,走出一條高效的路,但是它畢竟是基于某些固定的規(guī)則、算法來做的判斷,有時候并沒有我們?nèi)四X思維靈活,當我們確定優(yōu)化器選擇執(zhí)行計劃錯誤時該怎么辦呢,語句上加hint,提示它選擇哪條路是一種常見的優(yōu)化方法。

我們知道Oracle提供了比較靈活的hint提示來指示優(yōu)化器在多表連接時選擇哪種表連接方式,比如use_nlno_use_nl控制是否使用Nest Loop Join,use_hash,no_use_hash控制是否使用hash join。

但是MySQL長期以來只有一種表連接方式,那就是Nest Loop Join,直到MySQL8.0.18版本才出現(xiàn)了hash join, 所以MySQL在控制表連接方式上沒有提供那么多豐富的hint給我們使用,hash_joinno_hash_join的hint只是驚鴻一瞥,只在8.0.18版本存在,8.0.19及后面的版本又將這個hint給廢棄了,那如果我們想讓兩個表做hash join該怎么辦呢?

實驗

我們來以MySQL8.0.25的單機環(huán)境做一個實驗。建兩個表,分別插入10000行數(shù)據(jù),使用主鍵做這兩個表的關(guān)聯(lián)查詢。

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 ;

查詢一下兩表使用主鍵字段關(guān)聯(lián)查詢時實際的執(zhí)行計劃,如下圖所示:

MySQL優(yōu)化器hash?join怎么使用

查詢一下兩表使用非索引字段關(guān)聯(lián)查詢時實際的執(zhí)行計劃,如下圖所示:

MySQL優(yōu)化器hash?join怎么使用

從執(zhí)行計劃可以看出,被驅(qū)動表的關(guān)聯(lián)字段上有索引,優(yōu)化器在選擇表連接方式時會傾向于選擇Nest Loop Join,當沒有可用索引時傾向于選擇hash join。

基于這一點那我們可以使用no_index提示來禁止語句使用關(guān)聯(lián)字段的索引。

MySQL優(yōu)化器hash?join怎么使用

從上面的執(zhí)行計劃可以看出使用no_index提示后,優(yōu)化器選擇了使用hash join。

當索引的選擇性不好時,優(yōu)化器選擇使用索引做Nest Loop Join是效率是很低的。

我們將實驗的兩個表中c1列的數(shù)據(jù)做一下更改,使其選擇性變差,并在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);

當我們執(zhí)行sql :

select t1.*,t2.* from t1 join t2 on t1.c1=t2.c1;

這個查詢結(jié)果會返回大量數(shù)據(jù),被驅(qū)動表的關(guān)聯(lián)字段c1列的索引選擇性差,此時選擇hash join是更明智的選擇,但是優(yōu)化器會選擇走Nest Loop Join。我們可以通過實驗驗證一下hash join 與 Nest Loop Join的性能差異。

MySQL優(yōu)化器hash?join怎么使用

可以看出使用hash join的耗時是使用Nest Loop Join的1/6,但是優(yōu)化器根據(jù)成本估算時,使用Nest Loop Join的成本要比使用hash join的成本低很多,所以會去選擇Nest Loop Join,這個時候就需要加上hint 提示禁止使用關(guān)聯(lián)字段的索引,被驅(qū)動表上每次都全表掃描的代價是很高的,這樣優(yōu)化器估算后就會選擇走hash join。

MySQL官方文檔里提到用BNL,NO_BNL的hint提示來影響hash join的優(yōu)化,但是經(jīng)過實驗證明,在表連接關(guān)聯(lián)字段上沒有可用索引時,優(yōu)化器估算成本后不會對被驅(qū)動表使用BNL全表掃描的方式做嵌套循環(huán)連接,而是會選擇使用hash join,那這樣NO_BNL在這個場景下就沒有用武之地了。

那么既然不用這個索引,把這個索引去掉不就可以了嗎?為什么非要使用no_index的hint提示呢,我們要知道業(yè)務使用的場景何其多,此處不用,別處使用了這個索引效率可能會有大的提升啊,這個時候就凸顯了hint的優(yōu)勢,只需要控制此語句的使用就好了。

以上就是“MySQL優(yōu)化器hash join怎么使用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當前標題:MySQL優(yōu)化器hash?join怎么使用
標題鏈接:http://jinyejixie.com/article6/ghdsog.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序、標簽優(yōu)化、電子商務、移動網(wǎng)站建設、網(wǎng)站營銷、全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設
独山县| 铁力市| 隆德县| 山阴县| 漾濞| 巧家县| 务川| 双城市| 长乐市| 嘉祥县| 朔州市| 新闻| 卓资县| 黄浦区| 同心县| 宁强县| 宕昌县| 同心县| 长垣县| 浪卡子县| 安新县| 清徐县| 浪卡子县| 赤水市| 铁力市| 新和县| 嘉鱼县| 前郭尔| 手游| 濮阳市| 洛隆县| 陵川县| 中方县| 台东市| 巨鹿县| 海门市| 池州市| 五莲县| 泗水县| 宿迁市| 万全县|