mysql連接查詢中索引的重要性_MySQL
來源:懂視網(wǎng)
責(zé)編:小采
時間:2020-11-09 19:48:15
mysql連接查詢中索引的重要性_MySQL
mysql連接查詢中索引的重要性_MySQL:在mysql中,我們要從多張表中讀取數(shù)據(jù)時,往往需要用到連接查詢。連接查詢通過兩張表中符合連接關(guān)系的字段來建立兩張表的關(guān)聯(lián),通常包括內(nèi)連接、左外連接、右外連接和全連接。內(nèi)連接會保留兩張表中共有的那部分記錄,因此最后產(chǎn)生的連接表記錄數(shù)最少;全連接
導(dǎo)讀mysql連接查詢中索引的重要性_MySQL:在mysql中,我們要從多張表中讀取數(shù)據(jù)時,往往需要用到連接查詢。連接查詢通過兩張表中符合連接關(guān)系的字段來建立兩張表的關(guān)聯(lián),通常包括內(nèi)連接、左外連接、右外連接和全連接。內(nèi)連接會保留兩張表中共有的那部分記錄,因此最后產(chǎn)生的連接表記錄數(shù)最少;全連接
在mysql中,我們要從多張表中讀取數(shù)據(jù)時,往往需要用到連接查詢。連接查詢通過兩張表中符合連接關(guān)系的字段來建立兩張表的關(guān)聯(lián),通常包括內(nèi)連接、左外連接、右外連接和全連接。內(nèi)連接會保留兩張表中共有的那部分記錄,因此最后產(chǎn)生的連接表記錄數(shù)最少;全連接會保留兩張表中所有的記錄,因此最后產(chǎn)生的連接表記錄數(shù)最多;而左外連接會保留左表的全部記錄,右外連接會保留右表的全部記錄,因此最后產(chǎn)生的連接表記錄數(shù)處于內(nèi)連接和外連接之間。
下面我們以一個學(xué)生選課的例子,來分析下左外連接的性能。
首先定義一張學(xué)生表(student):
插入學(xué)生記錄,共10000條:
![\]()

然后定義一張學(xué)生選課表(student_to_class):![\]()

插入學(xué)生選課記錄,每個學(xué)生選擇2門課,共20000條記錄:![\]()

現(xiàn)在我們要統(tǒng)計每個學(xué)生的個人信息,包括他的姓名和他選擇的課程數(shù),這樣我們需要使用左外連接,具體SQL如下:
SELECT
a.student_id, student_name, count(*)
FROM
student a
LEFT JOIN student_to_class b ON a.student_id = b.student_id
GROUP BY a.student_id;
但是,這個查詢的執(zhí)行速度非常慢,花費了75.467s,當(dāng)然這與我在本機,而不是在服務(wù)器上搭建數(shù)據(jù)庫也有關(guān)系,可這樣的查詢效率肯定不能忍受。
下面我們來分析一下為什么這么慢:
首先用explain查看這個語句的查詢執(zhí)行計劃,可以看到type都為ALL,即在student表和student_to_class表中都使用的全表掃描,其中student表(a)中掃描了10649行,student_to_class表(b)中掃描了20287行,這樣無疑效率是非常低的。![\]()

對此,我們試著給student_to_class表的student_id字段添加索引:![\]()

然后再次執(zhí)行查詢,發(fā)現(xiàn)速度非常快,只有0.077s,改進得非常多。而相應(yīng)的查詢執(zhí)行計劃如下圖所示,發(fā)現(xiàn)在查詢student_to_class表時使用了索引student_index,使得只需要掃描1行就行了,相當(dāng)于原來的兩萬分之一,這就是效率改進的關(guān)鍵點所在。![\]()

因此,當(dāng)連接查詢時產(chǎn)生的連接表過大時,為了防止查詢次數(shù)過多,我們要經(jīng)常使用索引來減少查詢次數(shù),提高查詢效率。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com
mysql連接查詢中索引的重要性_MySQL
mysql連接查詢中索引的重要性_MySQL:在mysql中,我們要從多張表中讀取數(shù)據(jù)時,往往需要用到連接查詢。連接查詢通過兩張表中符合連接關(guān)系的字段來建立兩張表的關(guān)聯(lián),通常包括內(nèi)連接、左外連接、右外連接和全連接。內(nèi)連接會保留兩張表中共有的那部分記錄,因此最后產(chǎn)生的連接表記錄數(shù)最少;全連接