前言
在MySQL中,我們可以通過EXPLAIN命令獲取MySQL如何執行SELECT語句的信息,包括在SELECT語句執行過程中表如何連接和連接的順序。

下面分別對EXPLAIN命令結果的每一列進行說明:
.select_type:表示SELECT的類型,常見的取值有:
| 類型 | 說明 |
|---|---|
| SIMPLE | 簡單表,不使用表連接或子查詢 |
| PRIMARY | 主查詢,即外層的查詢 |
| UNION | UNION中的第二個或者后面的查詢語句 |
| SUBQUERY | 子查詢中的第一個 |
.table:輸出結果集的表(表別名)
.type:表示MySQL在表中找到所需行的方式,或者叫訪問類型。常見訪問類型如下,從上到下,性能由差到最好:
| ALL | 全表掃描 |
|---|---|
| index | 索引全掃描 |
| range | 索引范圍掃描 |
| ref | 非唯一索引掃描 |
| eq_ref | 唯一索引掃描 |
| const,system | 單表最多有一個匹配行 |
| NULL | 不用掃描表或索引 |
1、type=ALL,全表掃描,MySQL遍歷全表來找到匹配行
一般是沒有where條件或者where條件沒有使用索引的查詢語句
| EXPLAIN SELECT * FROM customer WHERE active=0; |

2、type=index,索引全掃描,MySQL遍歷整個索引來查詢匹配行,并不會掃描表
一般是查詢的字段都有索引的查詢語句
| EXPLAIN SELECT store_id FROM customer; |

3、type=range,索引范圍掃描,常用于<、<=、>、>=、between等操作
| EXPLAIN SELECT * FROM customer WHERE customer_id>=10 AND customer_id<=20; |

注意這種情況下比較的字段是需要加索引的,如果沒有索引,則MySQL會進行全表掃描,如下面這種情況,create_date字段沒有加索引:
| EXPLAIN SELECT * FROM customer WHERE create_date>='2006-02-13' ; |