最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

干涉MySQL優(yōu)化器使用hash?join的方法

 更新時間:2022年09月13日 14:13:28   作者:GreatSQL  
這篇文章主要介紹了如何干涉MySQL優(yōu)化器使用hash?join,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

GreatSQL社區(qū)原創(chuàng)內容未經授權不得隨意使用,轉載請聯(lián)系小編并注明來源。GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。

前言

數(shù)據(jù)庫的優(yōu)化器相當于人類的大腦,大部分時候都能做出正確的決策,制定正確的執(zhí)行計劃,走出一條高效的路,但是它畢竟是基于某些固定的規(guī)則、算法來做的判斷,有時候并沒有我們人腦思維靈活,當我們確定優(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ù),使用主鍵做這兩個表的關聯(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 ;

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

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

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

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

從上面的執(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;

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

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

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

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

總結

Nest Loop Join有其優(yōu)勢,它是response最快的連接方式,適用于返回數(shù)據(jù)量小的場景。當兩個大表連接,返回大量數(shù)據(jù),且關聯(lián)字段的索引比較低效時,使用hash join就會比較高效,我們可以使用no_index的hint提示禁用關聯(lián)字段的低效索引,促使優(yōu)化器選擇hash join。

到此這篇關于MySQL優(yōu)化器使用hash join的的文章就介紹到這了,更多相關MySQL優(yōu)化器使用hash join內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MySql數(shù)據(jù)庫觸發(fā)器使用教程

    MySql數(shù)據(jù)庫觸發(fā)器使用教程

    MySQL從5.0.2版本開始支持觸發(fā)器,MySQL的觸發(fā)器和存儲過程一樣,都是嵌入到MySQL服務器的一段程序,這篇文章主要給大家介紹了關于MySql數(shù)據(jù)庫觸發(fā)器使用的相關資料,需要的朋友可以參考下
    2022-05-05
  • MySQL中union和join語句使用區(qū)別的辨析教程

    MySQL中union和join語句使用區(qū)別的辨析教程

    這篇文章主要介紹了MySQL中union和join語句的用法區(qū)別,舉例說明了union和join在連接操作上的不同作用,需要的朋友可以參考下
    2015-12-12
  • 在CentOS上運行MySQL報錯Too many connections(連接數(shù)打滿)的解決方案

    在CentOS上運行MySQL報錯Too many connections(連接數(shù)打滿)的解決方案

    在CentOS服務器上運維MySQL時,經常會遇到 Too many connections 報錯,尤其是通過 mysqld_safe 腳本啟動、而非系統(tǒng) systemctl 管理的MySQL實例,本文結合實際運維場景,詳細講解該報錯的原因、應急解決步驟、永久優(yōu)化方案,需要的朋友可以參考下
    2026-03-03
  • MYSQL刪除匿名用戶的方法(提高安全性)

    MYSQL刪除匿名用戶的方法(提高安全性)

    今天看教程的時候,發(fā)現(xiàn)了MYSQL匿名用戶可以導致網站數(shù)據(jù)等安全問題,這里分享下mysql中刪除匿名用戶的步驟,方便需要的朋友
    2012-10-10
  • MySQL存儲過程中使用WHILE循環(huán)語句的方法

    MySQL存儲過程中使用WHILE循環(huán)語句的方法

    這篇文章主要介紹了MySQL存儲過程中使用WHILE循環(huán)語句的方法,實例分析了在MySQL中循環(huán)語句的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • mysql 5.7.18 免安裝版window配置方法

    mysql 5.7.18 免安裝版window配置方法

    這篇文章主要為大家詳細介紹了mysql 5.7.18 免安裝版window配置方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • MySQL在Linux系統(tǒng)中隱藏命令行中的密碼的方法

    MySQL在Linux系統(tǒng)中隱藏命令行中的密碼的方法

    這篇文章主要介紹了MySQL在Linux系統(tǒng)中隱藏命令行中的密碼的方法,作者利用簡單的C程序實現(xiàn),需要的朋友可以參考下
    2015-06-06
  • 使用mysql的disctinct group by查詢不重復記錄

    使用mysql的disctinct group by查詢不重復記錄

    非常不錯的方法,用mysql的group by解決不重復記錄的問題,看來我需要學習的地方太多了
    2008-08-08
  • MySQL系列之十一 日志記錄

    MySQL系列之十一 日志記錄

    這篇文章主要介紹了MySQL日志文件詳解,本文分別講解了錯誤日志、二進制日志、通用查詢日志、慢查詢日志、Innodb的在線redo日志、更新日志等日志類型和作用介紹,需要的朋友可以參考下
    2021-07-07
  • MySQL高級查詢之JOIN、子查詢、窗口函數(shù)實際案例

    MySQL高級查詢之JOIN、子查詢、窗口函數(shù)實際案例

    這篇文章主要介紹了MySQL高級查詢之JOIN、子查詢、窗口函數(shù)實際案例的相關資料,JOIN用于多表關聯(lián)查詢,子查詢用于數(shù)據(jù)篩選和過濾,窗口函數(shù)則提供靈活的數(shù)據(jù)統(tǒng)計和排名功能,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-04-04

最新評論

邛崃市| 大同县| 若尔盖县| 阳信县| 湘潭县| 麻江县| 嘉禾县| 封开县| 莒南县| 百色市| 宁津县| 镶黄旗| 大竹县| 新民市| 拉孜县| 太和县| 萨嘎县| 客服| 随州市| 县级市| 松江区| 隆回县| 特克斯县| 湖南省| 巢湖市| 邵武市| 长葛市| 桐梓县| 宝兴县| 科技| 包头市| 梁山县| 南陵县| 中超| 大兴区| 定边县| 苍溪县| 临澧县| 大田县| 苗栗市| 钟祥市|