MySQL 语句性能分析

MySQL 执行计划就是在一条 SELECT 语句前放上关键词 EXPLAIN ,MySQL 解释它将如何处理 SELECT,提供有关表如何联合和以什么次序联合的信息。借助于 EXPLAIN 可以知道:

  • 什么时候必须为表加入索引,以得到一个使用索引找到记录的更快的 SELECT 方法。
  • 优化器是否以一个最佳次序联结表



 各属性的含义如下:

id:查询的序列号

select_type:查询的类型,主要包括普通查询、联合查询和子查询。

table: 所访问数据库中表的名称。

type:联合查询使用的类型。

possible_keys:指出 MySQL 能使用哪个索引在该表中找到该行。如果这个值是空的,则表示没有相关的索引。这时要提高性能,可通过检验 WHERE 子句,看是否引用了某些字段,或者检查字段是否适合索引。

key:显示MySQL 实际决定使用的键。如果没有索引被选择,键是 NULL。

key_len:显示MySQL 决定使用的键长度。如果键是 NULL,长度就是NULL。注意,这个值可以反映出一个多重主键里 MySQL 实际使用了哪部分。

ref:显示哪个字段或常数与 key 一起被使用。

rows:这个值表示 MySQL 要遍历多少数据才能找到所需的结果集,其在 InnoDB 上是不准确的。

Extra:如果是 Only index,意味着信息只能用索引树中的信息检索,这比扫描整个表要快;如果是 where used,则表示使用了 where 限制,但是用索引还不够;如果是 impossible where,则表示通过收集到的统计信息判断出不可能存在的结果。除此之外,Extra 还有下面一些可能值:Using filesort  表示包含 orderby 且无法使用索引进行排序操作时,不得不使用相应的排序算法实现。using temporary 使用临时表,常见于 orderby 和 group by。select tables optimized way 使用聚合函数,并且 MySQL 进行了快速定位。通常是 MAX,MIN,COUNT(*) 等函数。

需要说明的是,type 显示的访问类型是较重要的指标,结果值从好到坏依次是:system(系统表)、const(读常量)、eq_ref(最多一条匹配结果,通常是通过主键访问)、ref(被驱动表索引使用)、fulltext(全文索引检索)、ref_or_null(带空值的索引查询)、index_merge(合并索引结果集)、unique_subquery(子查询中返回的字段是唯一组合或索引)、index_subquery(子查询返回的是索引,但非主键)、range(索引范围扫描)、index(全索引扫描)、ALL(全表扫描)。

一般来说,保证查询至少达到 range 级,最好能达到 ref 级。ALL 为全表扫描,是最坏的情况,这种情况往往是没用上索引。

猜你喜欢

转载自wangzq-phper.iteye.com/blog/2358312