搜尋
首頁資料庫mysql教程干涉MySQL優化器使用hash join的方法

推薦學習:mysql影片教學

#GreatSQL社群原創內容未經授權不得隨意使用,轉載請聯絡小編和註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。

前言

資料庫的優化器相當於人類的大腦,大部分時候都能做出正確的決策,制定正確的執行計劃,走出一條高效的路,但是它畢竟是基於某些固定的規則、演算法來做的判斷,有時候並沒有我們人腦思維靈活,當我們確定優化器選擇執行計劃錯誤時該怎麼辦呢,語句上加hint,提示它選擇哪條路是一種常見的最佳化方法。

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

但MySQL長期以來只有一種表連接方式,那就是Nest Loop Join,直到MySQL8.0.18版本才出現了hash join, 所以MySQL在控製表連接方式上沒有提供那麼多豐富的hint給我們使用,hash_joinno_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官方文件裡提到用BNLNO_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影片教學

#

以上是干涉MySQL優化器使用hash join的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:脚本之家。如有侵權,請聯絡admin@php.cn刪除
MySQL和其他SQL方言之間的語法有什麼區別?MySQL和其他SQL方言之間的語法有什麼區別?Apr 27, 2025 am 12:26 AM

mysqldiffersfromothersqldialectsinsyntaxforlimit,自動啟動,弦樂範圍,子征服和表面上分析。 1)MySqluessLipslimit,whilesqlserverusestopopandoraclesrontersrontsrontsrontsronnum.2)

什麼是mysql分區?什麼是mysql分區?Apr 27, 2025 am 12:23 AM

MySQL分區能提升性能和簡化維護。 1)通過按特定標準(如日期範圍)將大表分成小塊,2)物理上將數據分成獨立文件,3)查詢時MySQL可專注於相關分區,4)查詢優化器可跳過不相關分區,5)選擇合適的分區策略並定期維護是關鍵。

您如何在MySQL中授予和撤銷特權?您如何在MySQL中授予和撤銷特權?Apr 27, 2025 am 12:21 AM

在MySQL中,如何授予和撤銷權限? 1.使用GRANT語句授予權限,如GRANTALLPRIVILEGESONdatabase_name.TO'username'@'host';2.使用REVOKE語句撤銷權限,如REVOKEALLPRIVILEGESONdatabase_name.FROM'username'@'host',確保及時溝通權限變更。

說明InnoDB和Myisam存儲引擎之間的差異。說明InnoDB和Myisam存儲引擎之間的差異。Apr 27, 2025 am 12:20 AM

InnoDB適合需要事務支持和高並發性的應用,MyISAM適合讀多寫少的應用。 1.InnoDB支持事務和行級鎖,適用於電商和銀行系統。 2.MyISAM提供快速讀取和索引,適合博客和內容管理系統。

MySQL中有哪些不同類型的連接?MySQL中有哪些不同類型的連接?Apr 27, 2025 am 12:13 AM

MySQL中有四種主要的JOIN類型:INNERJOIN、LEFTJOIN、RIGHTJOIN和FULLOUTERJOIN。 1.INNERJOIN返回兩個表中符合JOIN條件的所有行。 2.LEFTJOIN返回左表中的所有行,即使右表中沒有匹配的行。 3.RIGHTJOIN與LEFTJOIN相反,返回右表中的所有行。 4.FULLOUTERJOIN返回兩個表中所有符合或不符合JOIN條件的行。

MySQL中有哪些不同的存儲引擎?MySQL中有哪些不同的存儲引擎?Apr 26, 2025 am 12:27 AM

mysqloffersvariousStorageengines,每個suitedfordferentusecases:1)InnodBisidealForapplicationsNeedingingAcidComplianCeanDhighConcurncurnency,supportingtransactionsancions and foreignkeys.2)myisamisbestforread-Heavy-Heavywyworks,lackingtransactionsactionsacupport.3)記憶

MySQL中有哪些常見的安全漏洞?MySQL中有哪些常見的安全漏洞?Apr 26, 2025 am 12:27 AM

MySQL中常見的安全漏洞包括SQL注入、弱密碼、權限配置不當和未更新的軟件。 1.SQL注入可以通過使用預處理語句防止。 2.弱密碼可以通過強制使用強密碼策略避免。 3.權限配置不當可以通過定期審查和調整用戶權限解決。 4.未更新的軟件可以通過定期檢查和更新MySQL版本來修補。

您如何確定MySQL中的慢速查詢?您如何確定MySQL中的慢速查詢?Apr 26, 2025 am 12:15 AM

在MySQL中識別慢查詢可以通過啟用慢查詢日誌並設置閾值來實現。 1.啟用慢查詢日誌並設置閾值。 2.查看和分析慢查詢日誌文件,使用工具如mysqldumpslow或pt-query-digest進行深入分析。 3.優化慢查詢可以通過索引優化、查詢重寫和避免使用SELECT*來實現。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!