MySQL多表關(guān)聯(lián)on和where速度對(duì)比實(shí)測(cè)看誰(shuí)更快
今天發(fā)現(xiàn)有人在討論:兩張MySQL的數(shù)據(jù)表按照某一個(gè)字段進(jìn)行關(guān)聯(lián)的時(shí)候查詢,我們使用on和where哪種查詢方式更快。
百聞不如一見,我們來(lái)親自測(cè)試下。
先說結(jié)論
Where、對(duì)等查詢的join速度基本一致,不對(duì)等查詢時(shí)一般join更慢。
實(shí)驗(yàn)1:不存在不等記錄
我們有兩張表,分別是member和member_class,數(shù)據(jù)結(jié)構(gòu)如下圖,其中 member.class_id 和 member_class.id 是關(guān)聯(lián)字段
我們分別向兩張表寫入了20萬(wàn)條數(shù)據(jù),其中member.class_id 都一定存在于member_class.id中(不存在不等記錄)
查全表
為了實(shí)驗(yàn)更加相對(duì)準(zhǔn)確,我們對(duì)每條結(jié)果查詢20次:
where查詢耗時(shí)分別為(秒):
0.253, 0.256, 0.256, 0.252, 0.257, 0.252, 0.260, 0.265, 0.253, 0.252, 0.254, 0.257, 0.254, 0.257, 0.243, 0.250, 0.252, 0.252, 0.255, 0.284
on查詢耗時(shí)分別為(秒):
0.247, 0.260, 0.250, 0.246, 0.271, 0.247, 0.251, 0.247, 0.243, 0.247, 0.247, 0.245, 0.249, 0.246, 0.247, 0.253, 0.248, 0.254, 0.251, 0.247, 0.250
where查詢平均為0.2557s,on查詢平均為0.2498s;兩者基本一致,相差幾乎可以忽略。
實(shí)驗(yàn)2:存在不等記錄
我們新建一個(gè)member_v2表,其中class_id只有20%是member_class.id中存在的
如下圖:
我們繼續(xù)查詢?nèi)頊y(cè)試:
能看出來(lái)非常明顯的差距,LEFT JOIN由于存在大量不等記錄,出現(xiàn)大量的NULL值,此時(shí)中間表查詢效率變得更低,而選擇WHERE查詢能夠在查詢時(shí)自動(dòng)過濾不等記錄。
所以查詢時(shí)間也更快一些。
總結(jié)
在對(duì)等查詢過程中,ON的查詢更快;在不對(duì)等查詢時(shí),WHERE更快。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何保護(hù)MySQL中重要數(shù)據(jù)的方法
在日常的工作中,保護(hù)數(shù)據(jù)免受未授權(quán)用戶的侵犯是系統(tǒng)管理員特別關(guān)心的問題。如果你目前用的是MySQL,就可以使用一些方便的功能來(lái)保護(hù)系統(tǒng),來(lái)大大減少機(jī)密數(shù)據(jù)被未授權(quán)用戶訪問的風(fēng)險(xiǎn)2011-10-10MySQL中Order By多字段排序規(guī)則代碼示例
這篇文章主要介紹了MySQL中Order By多字段排序規(guī)則代碼示例,小編覺得挺不錯(cuò)的,這里給大家分享下,需要的朋友可以參考。2017-10-10詳解MySQL多版本并發(fā)控制機(jī)制(MVCC)源碼
MVCC,即多版本并發(fā)控制(Multi-Version Concurrency Control)指的是,通過版本鏈維護(hù)一個(gè)數(shù)據(jù)的多個(gè)版本,使得讀寫操作沒有沖突,可保證不同事務(wù)讀寫、寫讀操作并發(fā)執(zhí)行,提高系統(tǒng)性能2021-06-06MYSQL數(shù)據(jù)插入之返回自增主鍵ID的方法詳解
這篇文章主要介紹了MYSQL數(shù)據(jù)插入之返回自增主鍵ID的方法詳解,mysql中的insert插入之后會(huì)有返回值,返回的是影響的行數(shù),也就是說,成功插入一條數(shù)據(jù)之后返回的是1,失敗則返回0,那么,很多時(shí)候我們都想要得到最后插入的id值,需要的朋友可以參考下2023-10-10mysql kill進(jìn)程后出現(xiàn)killed死鎖問題及解決
這篇文章主要介紹了mysql kill進(jìn)程后出現(xiàn)killed死鎖問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01深入理解Mysql事務(wù)隔離級(jí)別與鎖機(jī)制問題
MySQL默認(rèn)的事務(wù)隔離級(jí)別是可重復(fù)讀,用Spring開發(fā)程序時(shí),如果不設(shè)置隔離級(jí)別默認(rèn)用MySQL設(shè)置的隔離級(jí)別,如果Spring設(shè)置了就用已設(shè)置的隔離級(jí)別,本文重點(diǎn)給大家介紹Mysql事務(wù)隔離級(jí)別與鎖機(jī)制的相關(guān)知識(shí),一起看看吧2021-09-09MySQL給字符串加一個(gè)高效索引的實(shí)現(xiàn)
本文主要介紹了MySQL給字符串加一個(gè)高效索引的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03