在mysql中,我們要從多張表中讀取資料時,往往需要用到連線查詢。連線查詢通過兩張表中符合連線關係的字段來建立兩張表的關聯,通常包括內連線、左外連線、右外連線和全連線。內連線會保留兩張表中共有的那部分記錄,因此最後產生的連線表記錄數最少;全連線會保留兩張表中所有的記錄,因此最後產生的連線表記錄數最多;而左外連線會保留左表的全部記錄,右外連線會保留右表的全部記錄,因此最後產生的連線表記錄數處於內連線和外連線之間。
下面我們以乙個學生選課的例子,來分析下左外連線的效能。
首先定義一張學生表(student):
插入學生記錄,共10000條:
然後定義一張學生選課表(student_to_class):
插入學生選課記錄,每個學生選擇2門課,共20000條記錄:
現在我們要統計每個學生的個人資訊,包括他的姓名和他選擇的課程數,這樣我們需要使用左外連線,具體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;
但是,這個查詢的執行速度非常慢,花費了75.467s,當然這與我在本機,而不是在伺服器上搭建資料庫也有關係,可這樣的查詢效率肯定不能忍受。
下面我們來分析一下為什麼這麼慢:
首先用explain檢視這個語句的查詢執行計畫,可以看到type都為all,即在student表和student_to_class表中都使用的全表掃瞄,其中student表(a)中掃瞄了10649行,student_to_class表(b)中掃瞄了20287行,這樣無疑效率是非常低的。
對此,我們試著給student_to_class表的student_id欄位新增索引:
然後再次執行查詢,發現速度非常快,只有0.077s,改進得非常多。而相應的查詢執行計畫如下圖所示,發現在查詢student_to_class表時使用了索引student_index,使得只需要掃瞄1行就行了,相當於原來的兩萬分之一,這就是效率改進的關鍵點所在。
因此,當連線查詢時產生的連線表過大時,為了防止查詢次數過多,我們要經常使用索引來減少查詢次數,提高查詢效率。
MySQL 連線查詢中索引的重要性
在mysql中,我們要從多張表中讀取資料時,往往需要用到連線查詢。連線查詢通過兩張表中符合連線關係的字段來建立兩張表的關聯,通常包括內連線 左外連線 右外連線和全連線。內連線會保留兩張表中共有的那部分記錄,因此最後產生的連線表記錄數最少 全連線會保留兩張表中所有的記錄,因此最後產生的連線表記錄數最多...
MySQL中連線查詢之內連線
內連線方式通常包括等值連線,非等值連線,自連線。內連線的特點是連線之後的兩個表等級相同,沒有主副之分,匹配得到就輸出,匹配不到就跳過。先來看三張表 員工表 部門表 薪資等級表 1 等值連線 在連線條件中使用等於號 運算子比較被連線列的列值,其查詢結果中列出被連線表中的所有列,包括其中的重複屬性。問題...
mysql跨連線查詢 Mysql中的連線查詢
連線查詢 內連線 無條件內連線 無條件內連線,又名交叉連線 笛卡爾連線 第一張表中的每一項和另一張表的每一項依次組合 上圖兩張不一樣的join方法 有條件內連線 當連線的時候,篩選出那些有實際意義的記錄來進行組合 select from students join subjects on stude...