前言
在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' ; |