關於explain的執行計畫詳細資訊請參考上篇文章。下面用explain分析案例。
首先建立表student結構,該錶目前沒有索引,如下:
案例:查詢學號student_num=1,年齡age>20,班級class=1的記錄
id為1,只有一次查詢;
select_type為******,表示該條sql為簡單查詢;
table為student,表示查詢來自student表;
type為all,表示遍歷全表,查詢到記錄;
possible_keys為null,表示理論上沒有應用到student表中的索引;
key為null,表示實際上也沒有應用到student表上的索引;
key_len為null,表示用到的索引長度為0,因為沒有用到索引;
ref為null,表示用到的索引的列為空,因為沒有用到索引;
rows為6,表示為查詢到需要的記錄,讀取了表中的6條記錄;
extra為using where,表示使用了where條件進行過濾
優化1
下面在學號、年紀、班級上建索引:
create
index index_num_age_class on student(student_num, age, class);
下面再執行案例中的sql
從explain的執行計畫資訊可以看出,type=range,表示只檢索給定範圍的行,通過乙個索引age來檢索給定的範圍;possible_keys表示理論上用到了index_num_age_class索引;key表示實際上也用到了index_num_age_class索引;key_len的長度為10,表示用到的索引長度為10,由於建立表時,student_num、age都是int型別的,並且預設可以為null的,在mysql中int型別佔4個位元組,null佔乙個位元組,所以student_num和age分別佔5個位元組,最終在student_num、age和class三個欄位上建立的復合索引,只用到了前兩個索引,所以key_len的長度為10。
優化1與案例比,有了一定的優化,用到了部分索引,並且檢索型別是range範圍。
優化2
下面刪除原來的索引,在student_num,class和age上建索引,注意順序與優化1中的不同;
create
index indext_num_class_age on student(studeng_num, class, age);
下面再執行案例中的查詢語句
從explain的執行計畫資訊中可以看出,type=range,依然是範圍檢索;但是用到的索引長度key_len變成了15,表示用到的索引更多了,按照優化1中分析,student_num、class、age預設為空,分別佔5個位元組,共15個位元組,因此建立的復合索引完全用上了,屬於最好的情況;rows=1,表示只通過檢索了一條記錄就查到了索要的記錄,如果百萬級的資料,很顯然這種檢索的記錄少,能夠快速的找到需要的記錄。
優化1中用到了部分索引,通過檢索2條語句找到了索要的記錄;而優化2中用了全部的索引,只檢索1條語句就找到了索要的記錄。
本案例執行兩個表的聯合查詢。繼續用案例1中student表,然後建立teacher表,表如下:
目前student和teacher表均無索引,查詢班級class相等的學生和老師,用explain分析如下:
通過執行計畫分析,可以看出,查student和teacher表時,type型別均為all,表示全表查詢,也沒有索引,對於百萬級資料沒什麼效率可言。
優化1
在student的class欄位上建立索引
create
index id_class on student(class);
然後重新用explain分析執行計畫資訊:
發現與案例2比一樣,沒有什麼改變,沒什麼優化。
優化2
下面刪除student的字段class上的索引,在teacher的class欄位上建立索引
create
index id_class on teacher(class);
下面重新執行explain的執行計畫分析
發現在查詢teacher表時,type型別為ref,使用到了索引掃瞄,用到的索引為id_class;由於在建class表時,class欄位型別為int,預設為空的,所以key_len的長度為5。
優化1與優化2相比,優化2中檢索了7行資料,優化1中檢索了8行資料,因此優化2中檢索了更少的資料獲取需要的結果。
結論:對於左連線,索引一定要建立在右邊的表(此地為teacher)上才會起作用;同樣對於右連線,索引一定要建立在左邊的表上才可以起作用。
同理,對於三表查詢的,例如
select * from student left join teacher on student.class=teacher.class lefit join school on student.class=school.class;
在teacher和school的class上建立索引會發揮索引功效。
Explain優化索引
索引 按照mysql欄位進行一定的排序,二叉樹 雜湊演算法的基礎上面建立一些特徵值,然後根據特徵值快速查詢。mysql內部是二叉樹 btree explain 乙個mysql的分析語句的小工具 可以幫助開發人員分析sql語句 1.eg explain select from 表名 where 條件 ...
mysql 索引優化 Explain的使用
索引類似大學圖書館建書目索引,可以提高資料檢索的效率,降低資料庫的io成本 mysql提供了explain,用於顯示sql執行的詳細資訊,可以進行索引的優化。一 導致sql語句執行慢的原因 1.硬體問題。如 網路速度,記憶體不足,i o吞吐量小,磁碟空間滿了等。2.沒有索引 或者 索引失效。表中某些...
MySQL優化之索引篇 explain工具的介紹
explain簡介 explain專門用來做sql語句的調優的,在select語句前面加乙個explain可以把select的執行過程都列出來,包括哪些用了索引,哪些沒用索引,哪些查詢是全表查詢,哪些是索引查詢等 使用效果如下圖 概要描述 列名說明 id執行編號,標識select所屬的行。如果在語句...