通过EXPLAIN或者DESC命令可以获取MySQL如何执行SELECT语句的信息,包括SELECT语句执行过程中表如何连接和连接顺序。
例子:explain select * from order where num>=2 and id <=9;
结果显示
id: 1 select_type:SIMPLE table:user type:ALL possible_keys:NULL key:NULL key_len:NULL
ref: NULL rows:20 Extra:Using where
explain命令显示结果解释
id |
SELECT识别符。这是SELECT的查询序列号 |
select_type |
表示SELECT类型,可以为以下任何一种:
- SIMPLE:简单SELECT(不使用UNION或子查询)
- PRIMARY:主查询,最外面的SELECT
- UNION:UNION中的第二个或后面的SELECT语句
- DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询
- UNION RESULT:UNION 的结果
- SUBQUERY:子查询中的第一个SELECT
- DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询
- DERIVED:导出表的SELECT(FROM子句的子查询)
|
table |
输出结果集的表 |
type |
联接类型。下面给出各种联接类型,按照从最佳类型到最坏类型进行排序:
- NULL:MySQL不用访问表或者索引,就能得到结果例如:(explain select 1 from xxx where 1=1 ;)
- system:表仅有一行(=系统表)。这是const联接类型的一个特例。
- const:表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次!
- eq_ref:类似ref,区别是使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配。简单说就是primary key 或者 unique key
- ref:表示使用非唯一索引扫描或唯一索引的前缀扫描,返回匹配某个单独值的的记录行。
- ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。
- index_merge:该联接类型表示使用了索引合并优化方法。
- unique_subquery:该类型替换了下面形式的IN子查询的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。
- index_subquery:该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr)
- range:只检索给定范围的行,使用一个索引来选择行,常见于<,>,<=,>+,between等操作符。
- index:该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。
- ALL:进行完整的表扫描,MySQL遍历全表来匹配的行
|
possible_keys: |
表示查询时可能使用到的索引 |
key |
表示实际使用的索引 |
key_len |
表示使用到的索引字段的长度 |
ref |
显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。 |
rows |
扫描行的数量 |
Extra |
执行情况的说明和描述,包含在其他列中显示但是对执行计划非常重要的额外信息
- Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
- Not exists:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。
- range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。
- Using filesort:mysql无法按照表内既定的索引顺序进行读取。例如:select name from employee order by dept_id
- Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。
- Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。
- Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。
- Using sort_union(...), Using union(...), Using intersect(...):这些函数说明如何为index_merge联接类型合并索引扫描。
- Using index for group-by:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查 询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。
|