MySql小表驅(qū)動(dòng)大表原則

有的時(shí)候我們?cè)诓僮鲾?shù)據(jù)庫(kù)時(shí)會(huì)將兩個(gè)或多個(gè)數(shù)據(jù)表關(guān)聯(lián)起來(lái)通過(guò)一些條件篩選數(shù)據(jù)胀蛮,在關(guān)聯(lián)表時(shí)我們要遵循一些原則姻灶,這樣會(huì)使我們編寫(xiě)的SQL 語(yǔ)句在效率上快很多癌蚁。

一、優(yōu)化原則

小表驅(qū)動(dòng)大表算行,即小的數(shù)據(jù)集驅(qū)動(dòng)大得數(shù)據(jù)集。在知道什么是小表驅(qū)動(dòng)大表之前苫耸,我們先來(lái)了解兩個(gè)查詢關(guān)鍵字州邢,IN 與 EXISTS。我們通過(guò)兩段查詢語(yǔ)句先來(lái)了解一下它們的作用鲸阔。我建立了兩張表偷霉,一張員工表迄委,一張部門(mén)表,員工表中有部門(mén)id 這個(gè)屬性类少,將這兩張表關(guān)聯(lián)起來(lái)叙身。

我們先使用IN 來(lái)查詢數(shù)據(jù):

SELECT * 
FROM t_emp 
WHERE dept_id IN (SELECT dept_id FROM t_dept) 
LIMIT 5;

查詢結(jié)果:由于有很多的員工信息,在這里我就只查詢5 條數(shù)據(jù)硫狞。

+-------------+----------+------------+--------------+---------+
| emp_id      | emp_name | emp_gender | emp_email    | dept_id |
+-------------+----------+------------+--------------+---------+
| 00000000177 | 41d80    | m          | 41d80@zc.com |       1 |
| 00000000178 | a74b8    | m          | a74b8@zc.com |       1 |
| 00000000179 | 661ca    | m          | 661ca@zc.com |       1 |
| 00000000180 | 9413d    | m          | 9413d@zc.com |       1 |
| 00000000181 | 7d577    | m          | 7d577@zc.com |       1 |
+-------------+----------+------------+--------------+---------+

接下里使用EXISTS 來(lái)查詢數(shù)據(jù):

 SELECT * 
 FROM t_emp 
 WHERE EXISTS 
     (SELECT 1 
     FROM t_dept 
     WHERE t_dept.dept_id = t_emp.dept_id) 
 LIMIT 5;

查詢結(jié)果:與上面的結(jié)果一樣信轿。

+-------------+----------+------------+--------------+---------+
| emp_id      | emp_name | emp_gender | emp_email    | dept_id |
+-------------+----------+------------+--------------+---------+
| 00000000177 | 41d80    | m          | 41d80@zc.com |       1 |
| 00000000178 | a74b8    | m          | a74b8@zc.com |       1 |
| 00000000179 | 661ca    | m          | 661ca@zc.com |       1 |
| 00000000180 | 9413d    | m          | 9413d@zc.com |       1 |
| 00000000181 | 7d577    | m          | 7d577@zc.com |       1 |
+-------------+----------+------------+--------------+---------+

既然IN 和 EXISTS 都可以用來(lái)查詢數(shù)據(jù),那它們兩個(gè)有什么區(qū)別呢残吩?

SELECT * 
FROM t_emp 
WHERE dept_id IN 
    (SELECT dept_id 
    FROM t_dept);

// 這條SQL 語(yǔ)句相當(dāng)于:
for SELECT dept_id FROM t_dept
    for SELECT * FROM t_emp WHERE t_emp.dept_id = t_dept.dept_id

這里雖然我們編寫(xiě)的SQL 語(yǔ)句是主查詢員工信息财忽,子查詢部門(mén)id ,但是MySql 的執(zhí)行順序會(huì)先執(zhí)行子查詢泣侮,再執(zhí)行主查詢即彪,然后獲得我們要查詢的數(shù)據(jù)。

 SELECT * 
 FROM t_emp 
 WHERE EXISTS 
     (SELECT 1 
     FROM t_dept 
     WHERE t_dept.dept_id = t_emp.dept_id);

// 這條SQL 語(yǔ)句相當(dāng)于:     
for SELECT * FROM t_emp 
    for SELECT * FROM t_dept  WHERE t_dept.dept_id = t_emp.dept_id 

我們可以將EXISTS 語(yǔ)法理解為:將主查詢的數(shù)據(jù)放在子查詢中做條件驗(yàn)證活尊,根據(jù)結(jié)果TRUE 和 FALSE 來(lái)決定主查詢中的數(shù)據(jù)是否需要保留隶校。EXISTS 子查詢只返回TRUE 或 FALSE ,因此子查詢中的SELECT * 可以是SELECT 1 或者其他蛹锰,MySql 的官方說(shuō)在實(shí)際執(zhí)行時(shí)會(huì)忽略SELECT 清單深胳,因此是沒(méi)有 什么區(qū)別的。EXISTS 子查詢其實(shí)在執(zhí)行時(shí)铜犬,MySql 已經(jīng)對(duì)它做了一些優(yōu)化并不是對(duì)每條數(shù)據(jù)進(jìn)行對(duì)比舞终。

二、總結(jié)

在實(shí)際操作過(guò)程中我們要對(duì)兩張表的dept_id 都設(shè)置索引癣猾。在一開(kāi)始我們就講了一個(gè)優(yōu)化原則即:小表驅(qū)動(dòng)大表敛劝,在我們使用IN 進(jìn)行關(guān)聯(lián)查詢時(shí),通過(guò)上面IN 操作的執(zhí)行順序纷宇,我們是先查詢部門(mén)表再根據(jù)部門(mén)表查出來(lái)的id 信息查詢員工信息攘蔽。我們都知道員工表肯定會(huì)有很多的員工信息,但是部門(mén)表一般只會(huì)有很少的數(shù)據(jù)信息呐粘,我們事先通過(guò)查詢部門(mén)表信息查詢員工信息满俗,以小表(t_dept)的查詢結(jié)果,去驅(qū)動(dòng)大表(t_emp)作岖,這種查詢方式是效率很高的唆垃,也是值得提倡的。

但是我們使用EXISTS 查詢時(shí)痘儡,首先查詢員工表辕万,然后根據(jù)部門(mén)表的查詢條件返回的TRUE 或者 FALSE ,再?zèng)Q定員工表中的信息是否需要保留。這不就是用大的數(shù)據(jù)表(t_emp) 去驅(qū)動(dòng)小的數(shù)據(jù)表小的數(shù)據(jù)表(t_dept)了嗎渐尿?雖然這種方式也可以查出我們想要的數(shù)據(jù)醉途,但是這種查詢方式是不值得提倡的。

當(dāng)t_emp 表中數(shù)據(jù)多于 t_dept 表中的數(shù)據(jù)時(shí)砖茸,這時(shí)我們使用IN 優(yōu)于 EXISTS隘擎。當(dāng)t_dept 表中數(shù)據(jù)多于 t_emp 表中的數(shù)據(jù)時(shí)(我們這里只是假設(shè)),這時(shí)我們使用EXISTS 優(yōu)于 IN凉夯。因此是使用IN 還是使用EXISTS 就需要根據(jù)我們的需求決定了货葬。但是如果兩張表中的數(shù)據(jù)量差不多時(shí)那么是使用IN 還是使用 EXISTS 差別不大。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末劲够,一起剝皮案震驚了整個(gè)濱河市震桶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌征绎,老刑警劉巖蹲姐,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異人柿,居然都是意外死亡淤堵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)顷扩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人慰毅,你說(shuō)我怎么就攤上這事隘截。” “怎么了汹胃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵婶芭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我着饥,道長(zhǎng)犀农,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任宰掉,我火速辦了婚禮呵哨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘轨奄。我一直安慰自己孟害,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布挪拟。 她就那樣靜靜地躺著挨务,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谎柄,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天丁侄,我揣著相機(jī)與錄音,去河邊找鬼朝巫。 笑死鸿摇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捍歪。 我是一名探鬼主播户辱,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼糙臼!你這毒婦竟也來(lái)了庐镐?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤变逃,失蹤者是張志新(化名)和其女友劉穎必逆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體揽乱,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡名眉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凰棉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片损拢。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖撒犀,靈堂內(nèi)的尸體忽然破棺而出福压,到底是詐尸還是另有隱情,我是刑警寧澤或舞,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布荆姆,位于F島的核電站,受9級(jí)特大地震影響映凳,放射性物質(zhì)發(fā)生泄漏胆筒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一诈豌、第九天 我趴在偏房一處隱蔽的房頂上張望仆救。 院中可真熱鬧,春花似錦矫渔、人聲如沸派桩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)铆惑。三九已至范嘱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間员魏,已是汗流浹背丑蛤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撕阎,地道東北人受裹。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像虏束,于是被迫代替她去往敵國(guó)和親棉饶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容