程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql連接查詢中索引的重要性

mysql連接查詢中索引的重要性

編輯:MySQL綜合教程

mysql連接查詢中索引的重要性


在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行就行了,相當於原來的兩萬分之一,這就是效率改進的關鍵點所在。\\

因此,當連接查詢時產生的連接表過大時,為了防止查詢次數過多,我們要經常使用索引來減少查詢次數,提高查詢效率。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved