MySQL执行计划分析工具EXPLAIN用法详解
对于DBA来讲熟悉SQL的执行计划分析技巧对于快速定位数据库性能问题至关重要,下面简单介绍一下如何分析MySQL的执行计划。
一、EXPLAIN用法详解:EXPLAIN SELECT ……
变体: 1. EXPLAIN EXTENDED SELECT ……将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可得到被MySQL优化器优化后的查询语句
2. EXPLAIN PARTITIONS SELECT ……用于分区表的EXPLAIN
示例如下所示:
具体解释如下1.执行id
包含一组数字,id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行2.查询类型select_type
type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL ,一般来说,得保证查询至少达到range级别,最好能达到ref。ALL: 扫描全表index: 扫描全部索引树range: 扫描部分索引,索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、等的查询ref: 非唯一性索引扫描,返回匹配某个单独值的所有行。常见于使用非唯一索引即唯一索引的非唯一前缀进行的查找eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描const, system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。system是const类型的特例,当查询的表只有一行的情况下, 使用system。NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引。
3.possible_keys指出MySQL能使用哪个索引在表中找到行,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用4.key显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULLTIPS:查询中若使用了覆盖索引,则该索引仅出现在key列表中5.key_len表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度6.ref表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值7.rows表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数8.Extra包含不适合在其他列中显示但十分重要的额外信息二、关于MySQL执行计划的局限总结如下:1.EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况2.EXPLAIN不考虑各种Cache3.EXPLAIN不能显示MySQL在执行查询时所作的优化工作4.部分统计信息是估算的,并非精确值5.EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划