站点图标 IDC铺

关于mysql用explain来优化sql语句

可以帮助选择更好的索引和写出更优化的查询语句,可以帮助选择更好的索引和写出更优化的查询语句。对某个query优化中,需要不断的explain来验证各种调优是否有效。
EXPLAIN各列的含义:

id Mysql Query Optimizer选定的执行计划中的序列号(查询序列号)
select_type select查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询。
table 所引用的表。
type 显示的是访问类型,结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > range > index > ALL说明:
  • const 读常量,只读一次,一般是主键
  • eq_ref 最多只会有一个匹配结果,一般是通过主键或者唯一索引来访问
  • ref 这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中 读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好
  • unique_subquery 子查询中返结果字段组合是主键或唯一索引
  • range 索引范围扫描,使用 > 或 < 时发生
  • index 全索引扫描
  • ALL 全表扫描,这一般比较糟糕,应该尽量避免
possible_keys 指出MySQL能使用哪个索引在该表中找到行。如果是空的,没有相关的索引。
这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。
key 显示MySQL实际决定使用的键。如果没有索引被选择,键是NULL
ref 显示哪个字段或常数与key一起被使用。
rows 通过收集系统信息估算出来的结果记录条数
extra 查询中,每一步会进行的额外信息

举例:

mysql > explain select mail from user where uid in(select user_id from share_info where share_id=1)
+----+--------------------+------------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type        | table      | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+--------------------+------------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | PRIMARY            | user       | ALL   | NULL          | NULL    | NULL    | NULL  |  542 | Using where |
|  2 | DEPENDENT SUBQUERY | share_info | const | PRIMARY       | PRIMARY | 4       | const |    1 |             |
+----+--------------------+------------+-------+---------------+---------+---------+-------+------+-------------+

这里执行计划,是按照ID的大小,从大向小执行。
第一步,访问share_info,查询方式是:DEPENDENT SUBQUERY,对所需数据的访问方式是索引扫描,过滤的条件是常数,所以类型为const,所用到的索引是主键。

退出移动版