如何查看sql查詢是否使用了索引?


1. explain 執行計划, 

通過執行計划可以了解MySQL選擇了什么執行計划來執行SQL,並且SQL的執行過程到此結束,即並不會真正的往下交給執行器去執行;最終的目的還是優化MySQL的性能。

我們通過EXPLAIN語句來查看查看MySQL如何執行語句的信息;EXPLAIN語句可以查看SELECTDELETEINSERTREPLACTUPDATE語句。

mysql> explain select * from city where id <3; +----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | city  | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |    2 |   100.00 | Using where |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.05 sec)

字段說明:

字段 描述 備注
id 該SELECT標識符  
select_type 該SELECT類型  
table 輸出結果的表  
partitions 匹配的分區  
type 表的連接類型  
possible_keys 查詢時可能的索引選擇 只是有可能選擇的索引,但是也能最后選擇的索引不在該字段中
key 實際選擇的索引 需要重點了解的
key_len 所選KEY的長度  
ref 列與索引的比較  
rows 表示MySQL認為執行查詢必須檢查的行數 innodb中是個估算值
filtered 按表條件過濾的行百分比  
Extra 執行情況的附加信息 需要重點了解的

 2. type表的連接類型說明:

type列輸出介紹如何聯接表,接下來列舉常見聯接類型,性能從最佳到最差排序:

system

const     

首先,system是最優的,它的意思是表只有一行(但效果我沒演示出來),是const類型的一種特例,所以就把這兩個列一塊了。

eq_ref  在多表連接時,連接條件(ON)使用了唯一索引(UNIQUE NOT NULL,PRIMARY KEY)時,走eq_ref

ref      出現的條件是: 查找條件列使用了索引但不是PRIMARY KEYUNIQUE KEY。其意思就是雖然使用了索引,但該索引列的值並不唯一,有重復。這樣即使使用索引快速查找到了第一條數據,仍然不能停止,要進行目標值附近的小范圍掃描。但它的好處是它並不需要掃全表,因為索引是有序的,即便有重復值,也是在一個非常小的范圍內掃描。

fulltext

ref_or_null

index_merge

unique_subquery

index_subquery

range        是基於索引的范圍掃描,包含>,<,>=,<=,!=,like,in,not in,or,!=,not in的情況會走range;出現range的條件是:查詢條件列是非PRIMARY KEYUNIUQE KEY的索引列,也就是說條件列使用了索引,但該索引列的值並不是唯一的,這樣的話,即使很快的找到了第一條數據,但仍然不能停止的在指定的范圍內繼續找。

index           全索引掃描,根據條件掃描索引然后再回表查詢數據, 因為索引有序所以要比all效率高那么一奶奶了.

ALL          全表掃描,效果最差,什么情況下會走ALL?  1.查詢字段是非索引字段, 2.查詢條件中包含!= not in like 

小結

 

執行計划算是MySQL優化部分的內容了,想要弄懂首先要對SQL語句非常熟練,並且也要非常熟練索引相關的知識,還需要熟悉存儲引擎,因為有些情況是基於指定存儲引擎下的結果;除此之外,想要弄懂Extra欄,需要同時結合表的索引情況、查詢語句、優化器(MySQL會優化我們的SQL)、以及EXPLAINtype欄和rows欄等綜合分析出現的各種情況。

 

這里單獨對Extra的幾種情況做下總結:

 

  • Using index:表示使用索引,如果只有Using index,表示使用覆蓋索引返回數據而沒有回表查詢的操作。
  • Using index;Using where:說明在使用索引的基礎上還需要回表查詢記錄,可以考慮只返回指定的字段和建立聯合索引來嘗試避免回表查詢情況。
  • Using index condition:說明會先根據走索引過濾結果,然后再根據其他子句的情況做回表查詢操作。
  • Using where:表示在查詢中很可能出現了回表查詢的情況,可以觀察是否加個索引來優化。
  • Using temporary:表示MySQL需要創建臨時表來保存臨時結果;通常出現在包含不同列的GROUP BYORDER BY子句時,另外也時常跟Using filesort一起出現。
  • Using filesort:表示在使用索引之外,還需要額外的排序操作,也可以根據具體情況添加索引來解決。

 

轉自張開老師的博客

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM