成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

簡(jiǎn)單聊聊MySQL中join查詢

本篇文章給大家?guī)?lái)了關(guān)于mysql的相關(guān)知識(shí),其中主要介紹了關(guān)于join查詢的相關(guān)問(wèn)題,下面一起來(lái)看一下,希望對(duì)大家有幫助。

簡(jiǎn)單聊聊MySQL中join查詢

程序員必備接口測(cè)試調(diào)試工具:立即使用
Apipost = Postman + Swagger + Mock + Jmeter
Api設(shè)計(jì)、調(diào)試、文檔、自動(dòng)化測(cè)試工具
后端、前端、測(cè)試,同時(shí)在線協(xié)作,內(nèi)容實(shí)時(shí)同步

推薦學(xué)習(xí):mysql視頻教程

索引對(duì) join 查詢的影響

數(shù)據(jù)準(zhǔn)備

假設(shè)有兩張表 t1、t2,兩張表都存在有主鍵索引 id 和索引字段 a,b 字段無(wú)索引,然后在 t1 表中插入 100 行數(shù)據(jù),t2 表中插入 1000 行數(shù)據(jù)進(jìn)行實(shí)驗(yàn)

CREATE TABLE `t2` (  `id` int NOT NULL,  `a` int DEFAULT NULL,  `b` int DEFAULT NULL,  PRIMARY KEY (`id`),  KEY `t2_a_index` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;  CREATE PROCEDURE **idata**() BEGIN   DECLARE i INT;   SET i = 1;   WHILE (i <= 1000)do     INSERT INTO t2 VALUES (i,i,i);     SET i = i +1;     END WHILE; END; CALL **idata**(); CREATE TABLE t1 LIKE t2; INSERT INTO t1 (SELECT * FROM t2 WHERE id <= 100);
登錄后復(fù)制

有索引查詢過(guò)程

我們使用查詢 SELECT * FROM t1 STRAIGHT_JOIN t2 ON (t1.a=t2.a);因?yàn)?join 查詢 MYSQL 優(yōu)化器不一定能按照我們的意愿去執(zhí)行,所以為了分析我們選擇用 STRAIGHT_JOIN 來(lái)代替,從而更直觀的進(jìn)行觀察

簡(jiǎn)單聊聊MySQL中join查詢 圖 1

可以看出我們使用了 t1 作為驅(qū)動(dòng)表,t2 作為被驅(qū)動(dòng)表,上圖的 explain 中顯示本次查詢用上了 t2 表的字段 a索引,所以這個(gè)語(yǔ)句的執(zhí)行過(guò)程應(yīng)該是下面這樣的:

  • 從 t1 表中讀取一行數(shù)據(jù) r

  • 從數(shù)據(jù) r中取出字段 a到表 t2 中進(jìn)行匹配

  • 取出 t2 表中符合條件的行,和 r組成一行作為結(jié)果集的一部分

  • 重復(fù)執(zhí)行步驟 1-3,直到表 t1 循環(huán)數(shù)據(jù)

該過(guò)程稱之為 Index Nested-Loop Join,在這個(gè)流程里,驅(qū)動(dòng)表 t1 進(jìn)行了全表掃描,因?yàn)槲覀兘o t1 表插入了 100 行數(shù)據(jù),所以本次的掃描行數(shù)是 100,而進(jìn)行 join 查詢時(shí),對(duì)于 t1 表的每一行都需去 t2 表中進(jìn)行查找,走的是索引樹搜索,因?yàn)槲覀儤?gòu)造的數(shù)據(jù)都是一一對(duì)應(yīng)的,所以每次搜索只掃描一行,也就是 t2 表也是總共掃描 100 行,整個(gè)查詢過(guò)程掃描的總行數(shù)是 100+100=200 行。

無(wú)索引查詢過(guò)程

SELECT * FROM t1 STRAIGHT_JOIN t2 ON (t1.a = t2.b);
登錄后復(fù)制

簡(jiǎn)單聊聊MySQL中join查詢 圖 2

可以看出由于 t2 表字段 B上沒有索引,所以按照上述 SQL 執(zhí)行時(shí)每次從 t1 去匹配 t2 的時(shí)候都要做一次全表掃描,這樣算下來(lái)掃描 t2 多大 100 次,總掃描次數(shù)就是 100*1000 = 10 萬(wàn)行。

當(dāng)然了這個(gè)查詢結(jié)果還是在我們建的這兩個(gè)都是小表的情況下,如果是數(shù)量級(jí) 10 萬(wàn)行的表,就需要掃描 100 億行,這就太恐怖了!

2. 了解 Block Nested-Loop Join

Block Nested-Loop Join查詢過(guò)程

那么被驅(qū)動(dòng)表上沒有存在索引,這一切都是怎么發(fā)生的呢?

實(shí)際上當(dāng)被驅(qū)動(dòng)表上沒有可用的索引,算法流程是這樣的:

  • 把 t1 的數(shù)據(jù)讀取線程內(nèi)存 join_buffer 中,因?yàn)樯鲜鑫覀儗懙氖?select * from,所以相當(dāng)于是把整個(gè) t1 表放入了內(nèi)存;

  • 掃描 t2 的過(guò)程,實(shí)際上是把 t2 的每一行取出來(lái),跟 join_buffer 中的數(shù)據(jù)去做對(duì)比,滿足 join 條件的,作為結(jié)果集的一部分進(jìn)行返回。

簡(jiǎn)單聊聊MySQL中join查詢

所以結(jié)合圖 2中 Extra 部分說(shuō)明 Using join buffer 可以發(fā)現(xiàn)這一絲端倪,整個(gè)過(guò)程中,對(duì)表 t1 和t2 都做了一次全表掃描,因此掃描的行數(shù)是 100+1000=1100 行,因?yàn)?join_buffer 是以無(wú)序數(shù)組的方式組織的,因此對(duì)于表 t2 中每一行,都要做 100 次判斷,總共需要在內(nèi)存中進(jìn)行的判斷次數(shù)是 100*1000=10 萬(wàn)次,但是因?yàn)檫@ 10 萬(wàn)次是發(fā)生在內(nèi)存中的所以速度上要快很多,性能也更好。

Join_buffer

根據(jù)上述已經(jīng)知道了,沒有索引的情況下 MySQL 是將數(shù)據(jù)讀取內(nèi)存進(jìn)行循環(huán)判斷的,那么這個(gè)內(nèi)存肯定不是無(wú)限制讓你使用的,這時(shí)我們就需要用到一個(gè)參數(shù) join_buffer_size,該值默認(rèn)大小 256k,如下圖:

SHOW VARIABLES LIKE '%join_buffer_size%';
登錄后復(fù)制

簡(jiǎn)單聊聊MySQL中join查詢

圖 4

假如查詢的數(shù)據(jù)過(guò)大一次加載不完,只能夠加載部分?jǐn)?shù)據(jù)(80 條),那么查詢的過(guò)程就變成了下面這樣

  • 掃描表 t1,順序讀取數(shù)據(jù)行放入 join_buffer 中,直至加載完第 80 行滿了

  • 掃描表 t2,把 t2 表中的每一行取出來(lái)跟 join_buffer 中的數(shù)據(jù)做對(duì)比,將滿足條件的數(shù)據(jù)作為結(jié)果集的一部分返回

  • 清空 join_buffer

  • 繼續(xù)掃描表 t1,順序讀取剩余的數(shù)據(jù)行放入 join_buffer 中,執(zhí)行步驟 2

這個(gè)流程體現(xiàn)了算法名稱中 Block 的由來(lái),分塊 join,可以看出雖然查詢過(guò)程中 t1 被分成了兩次放入 join_buffer 中,導(dǎo)致 t2 表被掃描了 2次,但是判斷等值條件的次數(shù)還是不變的,依然是(80+20)*1000=10 萬(wàn)次。

所以這就是有時(shí)候 join 查詢很慢,有些大佬會(huì)讓你把 join_buffer_size 調(diào)大的原因。

如何正確的寫出 join 查詢

驅(qū)動(dòng)表的選擇

  • 有索引的情況下

在這個(gè) join 語(yǔ)句執(zhí)行過(guò)程中,驅(qū)動(dòng)表是走全表掃描,而被驅(qū)動(dòng)表是走樹搜索。

假設(shè)被驅(qū)動(dòng)表的行數(shù)是 M,每次在被驅(qū)動(dòng)表查詢一行數(shù)據(jù),先要走索引 a,再搜索主鍵索引。每次搜索一棵樹近似復(fù)雜度是以 2為底的 M的對(duì)數(shù),記為 log2M,所以在被驅(qū)動(dòng)表上查詢一行數(shù)據(jù)的時(shí)間復(fù)雜度是 2*log2M。

假設(shè)驅(qū)動(dòng)表的行數(shù)是 N,執(zhí)行過(guò)程就要掃描驅(qū)動(dòng)表 N 行,然后對(duì)于每一行,到被驅(qū)動(dòng)表上 匹配一次。因此整個(gè)執(zhí)行過(guò)程,近似復(fù)雜度是 N + N2log2M。顯然,N 對(duì)掃描行數(shù)的影響更大,因此應(yīng)該讓小表來(lái)做驅(qū)動(dòng)表。

  • 那沒有索引的情況

上述我知道了,因?yàn)?join_buffer 因?yàn)榇嬖谙拗疲圆樵兊倪^(guò)程可能存在多次加載 join_buffer,但是判斷的次數(shù)都是 10 萬(wàn)次,這種情況下應(yīng)該怎么選擇?

假設(shè),驅(qū)動(dòng)表的數(shù)據(jù)行數(shù)是 N,需要分 K 段才能完成算法流程,被驅(qū)動(dòng)表的數(shù)據(jù)行數(shù)是 M。這里的 K不是常數(shù),N 越大 K就越大,因此把 K 表示為λ*N,顯然λ的取值范圍 是 (0,1)。

掃描的行數(shù)就變成了 N+λNM,顯然內(nèi)存的判斷次數(shù)是不受哪個(gè)表作為驅(qū)動(dòng)表而影響的,而考慮到掃描行數(shù),在 M和 N大小確定的情況下,N 小一些,整個(gè)算是的結(jié)果會(huì)更小,所以應(yīng)該讓小表作為驅(qū)動(dòng)表

總結(jié):真相大白了,不管是有索引還是無(wú)索引參與 join 查詢的情況下都應(yīng)該是使用小表作為驅(qū)動(dòng)表。

什么是小表

還是以上面表 t1 和表 t2 為例子:

SELECT * FROM t1 STRAIGHT_JOIN t2 ON t1.b = t2.b WHERE t2.id <= 50;  SELECT * FROM t2 STRAIGHT_JOIN t1 ON t1.b = t2.b WHERE t2.id <= 50;
登錄后復(fù)制

上面這兩條 SQL 我們加上了條件 t2.id <= 50,我們使用了字段 b,所以兩條 SQL 都沒有用上索引,但是第二條 SQL 可以看出 join_buffer 只需要放入前 50 行,顯然查詢更快,所以 t2 的前 50 行就是那個(gè)相對(duì)較小的表,也就是我們上面說(shuō)所說(shuō)的‘小表’。

再看另一組:

SELECT t1.b,t2.* FROM t1 STRAIGHT_JOIN t2 ON t1.b = t2.b WHERE t2.id <= 100;  SELECT t1.b,t2.* FROM t2 STRAIGHT_JOIN t1 ON t1.b = t2.b WHERE t2.id <= 100;
登錄后復(fù)制

這個(gè)例子里,表 t1 和 t2 都是只有 100 行參加 join。 但是,這兩條語(yǔ)句每次查詢放入 join_buffer 中的數(shù)據(jù)是不一樣的: 表 t1 只查字段 b,因此如果把 t1 放到 join_buffer 中,只需要放入字段 b 的值; 表 t2 需要查所有的字段,因此如果把表 t2 放到 join_buffer 中的話,就需要放入三個(gè)字 段 id、a 和 b。

這里,我們應(yīng)該選擇表 t1 作為驅(qū)動(dòng)表。也就是說(shuō)在這個(gè)例子里,”只需要一列參與 join 的 表 t1“是那個(gè)相對(duì)小的表。

結(jié)論:

在決定哪個(gè)表做驅(qū)動(dòng)表的時(shí)候,應(yīng)該是兩個(gè)表按照各自的條件過(guò)濾,過(guò) 濾完成之后,計(jì)算參與 join 的各個(gè)字段的總數(shù)據(jù)量,數(shù)據(jù)量小的那個(gè)表,就是“小表”, 應(yīng)該作為驅(qū)動(dòng)表。

推薦學(xué)習(xí):mysql視頻教程

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
色欲香天天综合网站| 免费看30分钟打扑克教程| 久久久国产精品人妻AⅤ麻豆| 精品免费看国产一区二区| 久久久久精品一区中文字幕| 蜜桃视频一区二区三区| 人人妻人人做从爽精品| 玩肥熟老妇BBWXXX视频 | 第一章少妇初尝云雨| 国产精品偷窥熟女精品视频| 极品少妇XXXX精品少妇小说| 久久无码喷吹高潮播放不卡| 欧美成人WWW免费全部网站| 日韩一区二区在线视频| 性做久久久久久久久不卡| 亚洲中字幕日产AV片在线| XXXXXHD亚洲日本HD| 对白脏话肉麻粗话AV| 国产内射爽爽大片视频社区在线 | 亚洲AV激情无码专区在线播放| 亚洲国产精品第一区二区三区| 天堂中文最新版在线中文| ZLJZLJZLJZLJ亚洲| 亚洲AV无码熟妇在线观看| 国产A V无码专区亚洲AV| 中文在线ずっと好きだった| 亚洲 中文字幕在线播| 亚洲乱码一区AV春药高潮图片| 在教室伦流澡到高潮H强圩| 亚洲AV永久纯肉无码精品动漫| 色婷婷综合久久久久中文一区二区| 国产无遮挡又黄又大又爽| 中文字幕乱码人妻无码久久| 欧美美女多人群交视频| 亚洲AV乱码一区二区三区林ゆな| 内射到高潮的H小说| 久久棈精品久久久久久噜噜| 做AJ的视频大全电视剧| 亚洲AAAAA特级| 亚洲伊人久久综合成人| 99999久久久久久亚洲| 风流老熟女一区二区三区| 狠狠躁天天躁无码中文字幕图| 免费直播视频在线观看| 偷拍精品视频一区二区三区| 永久免费AV网站| 国产99在线 | 欧美| 久久综合狠狠色综合伊人| 少妇人妻真实偷人精品视频| 亚洲综合国产成人无码| 国产 熟女 高潮 www| 久久理伦片琪琪电影院| 少妇饥渴偷公乱第一章全文| 已婚少妇美妙人妻系列| 国产大学生粉嫩无套流白浆| 免费观看的国产大片APP下载| 少妇粉嫩小泬喷水视频WWW| 欧美最猛激情性AAAAA| 鲁鲁夜夜天天综合视频| 久久精品国产99国产精品亚洲| 呦系列视频一区二区三区| 短篇公交车高H肉辣全集目录| 内地CHINA高潮VIDEO| 亚洲AV日韩AⅤ无码| 亚洲人成电影在线观看天堂色| 亚洲AV色无码乱码在线观看| 午夜理论电影在线观看亚洲| 午夜人妻免费视频| 亚洲AV熟女高潮30P| 中文乱码精品一区二区三区人妻 | 久久AⅤ人妻少妇嫩草影院| 日韩欧无码一二三区免费不卡| 一边做一边潮喷30P| 国产乱色精品成人免费视频| 人妻少妇精品无码专区二区| 亚洲综合无码AV一区二区三区| 国产精品美女久久久久久 | 精品亚洲国产成人AV在线小说| 真人新婚之夜破苞第一次视频| 国产成人亚洲综合A∨| 国产一起色一起爱| 日本适合十八岁以上的护肤品一| 永久免费AV网站| 18禁又污又黄又爽的网站| 国产乱人伦偷精精品视频| 人妻在厨房被侮辱高清版| 曰韩无码AV一区二区免费 | 无码精品人妻一区二区三区aV| MM1313亚洲精品无码又大又| H罩杯大胸爆乳交在线观看| 九九久久99综合一区二区| 无码人妻精品中文字幕| 不屈的儿媳妇电视剧汉语版| 嫩BBB槡BBBB搡BBBB| 夜鲁鲁鲁夜夜综合视频欧美| 国产色母和进口色母区别| 日韩精品真人荷官无码| 94久久国产乱子伦精品免费| 久久精品无码一区二区三区| 亚洲AV无码麻豆一区二区三区 | 没带罩子被校霸C了一节课怎么办| 亚洲A成人无码网站在线| 国产成人国拍亚洲精品| 日产精品一线二线三线优势| CHINA熟妇老熟女HD| 美女GIF趴跪式抽搐动态图| 亚洲一区强奸视频| 精品国产第一国产综合精品| 西西人体444WWW大胆无码视| 国产成人a在线看片色欲AV| 日韩无码一区视频| 啊别插了视频髙清在线观看| 男女作爱网站免费观看全过程| 一本一本久久AA综合精品| 精品无码国产AV一区二区三区| 性色AV蜜臀AV色欲AV| 国产精品无码A∨麻豆| 特黄AAAAAAAAA毛片免费视频| 村长趴在小雪身上耕耘视频| 日本JAPANESE护士人妻| 波多野结衣的电影有哪些| 日本老熟妇ⅩXX| 少妇的BBW性大片| 一二三四免费观看在线中文版 | 精品国产AV无码一区二区三区| 男人j捅进女人p| 亚洲AV永久无码精品一区二区国| 锕锕锕锕锕锕~好深啊APP下载| 精品第一国产综合精品蜜芽| 少妇人妻无码专区视频免费| 丰满大爆乳波霸奶| 欧美日韩视频一区二区| 欧美老肥妇多毛XXXXX| 久久免费观看午夜成人网站| 欧美性色XXⅩXXA片HD| 英语老师乖乖挽起裙子的意思 | √天堂8资源中文在线| 国产97色在线 | 国| 欧美成人精品第一区| 亚洲国产欧美在线人成APP| 国产AV妓女影视妓女影院| 天天做天天摸天天爽天天爱| 涨乳催乳改造调教公主| 免费人妻精品一区二区三区| A级黑粗大硬长爽猛出猛进| 秋霞国产午夜伦午夜无码灬| 成熟人妻换╳╳╳╳Ⅹ| 天天做天天爱夭大综合网| 国产全肉乱妇杂乱视频| 亚洲精品无码AⅤ片影音先锋在线| 久久99精品久久只有精品| 有码中文AV无码中文AV| 欧美日韩乱一区二区三区| 大胆极品美軳人人体| 午老司机午夜福利视频| 精品VIDEOSSEXFREEOHDBBW| 亚洲一区无码中文字幕| 女强人被春药精油按摩4| 成人国产精品一区二区视频 | 色戒2小时38分无删减版| 办公室紧身女教师| 色8激情欧美成人久久综合电影 | 大胆极品美軳人人体| 日本丰满的人妻HD高清在线| 97色伦综合在线欧美视频| 奶头被民工们吸得又红又肿怎么办 | 一本大道香蕉大L在线吗视频| 大波妺AV网站影院| 毛片无遮挡高清免费| 尤物蜜芽国产成人精品区| 两个黑人大战嫩白金发美女| 综合偷自拍亚洲乱中文字幕| 男朋友一晚弄了我5次正常吗| 精品国产第一福利网站| 国产一区二区三区不卡AV| 亚洲欧美日韩综合一区| 亚洲亚洲人成综合网络| 玩弄白嫩少妇XXXXX性| 国产亚洲日韩一区二区三区| 亚洲AV极品熟妇一品二品三品| 黑人男女粗大猛烈进出视频| 亚洲色一色噜一噜噜噜| 蜜芽久久人人超碰爱香蕉| 666西方大但人文艺术| 成 人 网 站 在线 看 免费| 欧美性大片XXXXX久久久| 无码中文亚洲AV吉吉影音先锋 | 人妻丰满熟妇AⅤ无码区| 高校美女内射含羞草| 综合无码精品人妻一区二区三区 | 一区二区国产高清视频在线| 老熟妇仑乱视频一区二区| 91人妻人人澡人爽人精品| 视频无码一区二区| 年轻丰满的继牳3免费看| 乱中年女人伦AV| 浓精喷进老师黑色丝袜| 亚洲成人AV在线| 欧美日本操逼视频| 国产午夜成人无码免费看不卡 |