1. explain 執行計划,
通過執行計划可以了解MySQL
選擇了什么執行計划來執行SQL
,並且SQL
的執行過程到此結束,即並不會真正的往下交給執行器去執行;最終的目的還是優化MySQL
的性能。
我們通過EXPLAIN
語句來查看查看MySQL
如何執行語句的信息;EXPLAIN
語句可以查看SELECT
、DELETE
、INSERT
、REPLACT
和UPDATE
語句。
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 KEY
和UNIQUE KEY
。其意思就是雖然使用了索引,但該索引列的值並不唯一,有重復。這樣即使使用索引快速查找到了第一條數據,仍然不能停止,要進行目標值附近的小范圍掃描。但它的好處是它並不需要掃全表,因為索引是有序的,即便有重復值,也是在一個非常小的范圍內掃描。
fulltext
ref_or_null
index_merge
unique_subquery
index_subquery
range
是基於索引的范圍掃描,包含>,<,>=,<=,!=,like,in,not in,or,!=,not in
的情況會走range
;出現range
的條件是:查詢條件列是非PRIMARY KEY
和UNIUQE KEY
的索引列,也就是說條件列使用了索引,但該索引列的值並不是唯一的,這樣的話,即使很快的找到了第一條數據,但仍然不能停止的在指定的范圍內繼續找。
index
全索引掃描,根據條件掃描索引然后再回表查詢數據, 因為索引有序所以要比all效率高那么一奶奶了.
ALL
全表掃描,效果最差,什么情況下會走ALL? 1.查詢字段是非索引字段, 2.查詢條件中包含!= not in like
小結
執行計划算是MySQL
優化部分的內容了,想要弄懂首先要對SQL
語句非常熟練,並且也要非常熟練索引相關的知識,還需要熟悉存儲引擎,因為有些情況是基於指定存儲引擎下的結果;除此之外,想要弄懂Extra
欄,需要同時結合表的索引情況、查詢語句、優化器(MySQL
會優化我們的SQL
)、以及EXPLAIN
的type
欄和rows
欄等綜合分析出現的各種情況。
這里單獨對Extra
的幾種情況做下總結:
Using index
:表示使用索引,如果只有Using index
,表示使用覆蓋索引返回數據而沒有回表查詢的操作。Using index;Using where
:說明在使用索引的基礎上還需要回表查詢記錄,可以考慮只返回指定的字段和建立聯合索引來嘗試避免回表查詢情況。Using index condition
:說明會先根據走索引過濾結果,然后再根據其他子句的情況做回表查詢操作。Using where
:表示在查詢中很可能出現了回表查詢的情況,可以觀察是否加個索引來優化。Using temporary
:表示MySQL
需要創建臨時表來保存臨時結果;通常出現在包含不同列的GROUP BY
和ORDER BY
子句時,另外也時常跟Using filesort
一起出現。Using filesort
:表示在使用索引之外,還需要額外的排序操作,也可以根據具體情況添加索引來解決。
轉自張開老師的博客