暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
MYSQL执行计划.pdf
520
7页
8次
2021-02-07
25墨值下载
分析执行计划的显示内容
mysql> explain select * from users where id in (select id from adress where adress ='qqqqqqq');
+----+-------------+--------+--------+---------------+---------+---------+-----------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+--------+---------------+---------+---------+-----------------+------+-------------+
| 1 | SIMPLE | adress | ALL | PRIMARY | NULL | NULL | NULL | 5 | Using where |
| 1 | SIMPLE | users | eq_ref | PRIMARY | PRIMARY | 4 | test2.adress.id | 1 | NULL |
+----+-------------+--------+--------+---------------+---------+---------+-----------------+------+-------------+
2 rows in set (0.00 sec)
执行计划的ID
1.
id相同,执行顺序由上至下
id不同,如果是子查询,id的序号会递增,id的值越大优先级越高,越先被执行
执行计划的select_type
2.
SIMPLE:简单的 select 查询,查询中不包含子查询或者 union
PRIMARY:查询中包含子部分,最外层查询则被标记 primary
SUBQUERY/MATERIALIZEDSUBQUERY 表示在 select where 列表中包含了子查询,MATERIALIZED:表示 where 后面 in
件的子查询
UNION:表示 union 中的第二个或后面的 select 语句
UNION RESULTunion 的结果
对于 UNION 和 UNION RESULT 可以通过下面的例子展现:
EXPLAIN
SELECT * FROM users WHERE id IN(1, 2)
UNION
SELECT * FROM users WHERE id IN(3, 4);
执行计划的table
3.
查询涉及到的表。
直接显示表名或者表的别
<unionM,N> ID MN 查询 union 产生的结果
<subqueryN> ID N 查询产生的结果
执行计划的type
4.
访问类型,SQL 查询优化中一个很重要的指标,结果值从好到坏依次是:system > const > eq_ref > ref > range > index > ALL
system:系统表,少量数据,往往不需要进行磁盘IO
const:常量连接
eq_ref:主键索引(primary key)或者非空唯一索引(unique not null)等值扫描
ref:非主键非唯一索引等值扫描
range:范围扫描
index:索引树扫描
ALL:全表扫描(full table scan)
下面通过举例说明。
system
explain select * from mysql.time_zone;
上例中,从系统库 MySQL 的系统表 time_zone 里查询数据,访问类型为 system,这些数据已经加载到内存里,不需要进
行磁盘 IO,这类扫描是速度最快的。
MYSQL执行计划
2020
11
16
14:15
分区 MYSQL执行计划 的第 1
explain select * from (select * from user where id=1) tmp;
再举一个例子,内层嵌套(const)返回了一个临时表,外层嵌套从临时表查询,其扫描类型也system,也不需要走磁盘
IO,速度超快。
const
explain select * from user where id=1;
const 扫描的条件为:
命中主键(primary key)或者唯一(unique)索引
被连接的部分是一个常量(const)值
如上例,id是主键索引,连接部分是常量1。
eq_ref
EXPLAIN SELECT * FROM USER,user_ex WHERE user.id=user_ex.id;
eq_ref 扫描的条件为,对于前表的每一行(row),后表只有一行被扫描
再细化一点:
join 查询
命中主键(primary key)或者非空唯一(unique not null)索引
等值连接;
如上例,id 是主键,该 join 查询为 eq_ref 扫描。
ref
EXPLAIN SELECT * FROM USER,user_ex WHERE user.id=user_ex.id;
如果把上例 eq_ref 案例中的主键索引,改为普通非唯一(non unique)索引。就由 eq_ref 降级为了 ref,此时对于前表
的每一行(row),后表可能有多于一行的数据被扫描
select * from user where id=1;
当 id 改为普通非唯一索引后,常量的连接查询,也由 const 降级为了 ref,因为也可能有多于一行的数据被扫描。
ref 扫描,可能出现在 join 里,也可能出现在单表普通索引里,每一次匹配可能有多行数据返回,虽然它比 eq_ref 要
慢,但它仍然是一个很快的 join 类型。
range
explain select * from user where id between 1 and 4;
explain select * from user where id in(1,2,3);
explain select * from user where id > 3;
分区 MYSQL执行计划 的第 2
of 7
25墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文档被以下合辑收录

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜