mysql用explain来优化sql语句

本文介绍如何使用MySQL的EXPLAIN工具来优化SQL查询语句。详细解释了EXPLAIN输出的各项指标意义,如id、select_type、table等,并给出了具体的示例帮助理解不同的查询优化情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

idMysql Query Optimizer选定的执行计划中的序列号(查询序列号)
select_typeselect查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询。
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,所用到的索引是主键。

posted on 2011-09-05 05:22  之乎者也2011 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/wrmfw/archive/2011/09/05/2166933.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值