一、用法
explain + SQL语句
例如:
二、各个关键字含义
1. id
SELECT识别符,是SELECT查询序列号,查询序号即为sql语句执行的顺序,表示查询中执行select子句或操作表的顺序。(id相同,执行顺序从上往下;id不同,id值越大,优先级越高,越先执行)
例如:
2. select_type
查询中每个select的查询类型。主要用于区别普通查询,联合查询,子查询等的复杂查询。
- SIMPLE
简单的select查询,查询中不包含子查询或者UNION。
例如: - PRIMARY
查询中若包含任何复杂的子部分,最外层查询被标记。
例如: - SUBQUERY
在select或where列表中包含了子查询。
例如: - DERIVED
在from列表中包含的子查询被标记为derived(衍生),MySQL会递归执行这些子查询,把结果放到临时表中。
例如: - UNION
如果第二个select出现在UNION之后,则被标记为UNION,如果union包含在from子句的子查询中,外层select被标记为derived。
例如: - UNION RESULT
UNION 的结果。
3. table
显示这一行的数据是引用的哪张表。
4. type
显示联结类型,显示查询使用了何种类型,按照从最差到最佳类型排序
- ALL
遍历全表以找到匹配的行。 - index
直接从索引数据结构中找寻数据。
例如: - range
只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引,一般就是where语句中出现了between,in等范围的查询。
例如: - ref
非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,可能会找多个符合条件的行,属于查找和扫描的混合体。
例如: - eq_ref
唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于唯一索引或者主键扫描。 - const
表示通过索引一次就找到。
例如: - system
该类型在实际开发中基本不存在,该类型表示表中只有一行记录。
5. possible_keys
指出MySQL能使用哪个索引在该表中找到行。
6. key
显示查询语句中实际使用的索引,如果没有使用则为NULL。
7. key_len
表示索引中使用的字节数,该列计算查询中使用的索引的长度在不损失精度的情况下,长度越短越好。如果键是NULL,则长度为NULL。该字段显示为索引字段的最大可能长度,并非实际使用长度。
8. ref
显示索引的哪一列或常量被用于查找索引列的值。
9. rows
根据表统计信息及索引选用情况,大致估算出找到所需的记录锁需要读取的行数,值越大越不好。
10. Extra
- Using filesort
说明mysql读数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,mysql无法利用索引完成的排序称为"文件排序"。 - Using temporary
使用了临时表保存中间结果,mysql在对查询结果排序时使用临时表,常见于排序 order by 和分组查询 group by。 - Using index
表示相应的select操作用使用覆盖索引,避免访问了表的数据行。如果同时出现using where,表名索引被用来执行索引键值的查找;如果没有同时出现using where,表名索引用来读取数据而非执行查询动作。
例如: - Using where
表明使用where过滤。
例如: - Using join buffer
表明使用了连接缓存。
例如: - impossible WHERE
where子句的值总是false。
例如:(表中不存在id=100的数据) - select tables optimized away
在没有group by子句的情况下,基于索引优化Min、max操作或者对于MyISAM存储引擎优化count(*),不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。 - distinct
优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作。
三、MySQL索引的查看、添加和删除
1. 查看索引
show index from `table_name`;
2. 添加索引
-- PRIMARY KEY(主键索引)
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
-- UNIQUE(唯一索引)
ALTER TABLE `table_name` ADD UNIQUE (`column` )
-- INDEX(普通索引)
ALTER TABLE `table_name` ADD INDEX `index_name` ( `column` )
-- FULLTEXT(全文索引)
ALTER TABLE `table_name` ADD FULLTEXT ( `column` )
-- 联合索引
ALTER TABLE `table_name` ADD INDEX `index_name` ( `column1`, `column2`, `column3` )
例如:
3. 删除索引
drop index `index_name` on `table_name`;
例如: