MySQL 运维实战课
张新铭(俊达)
云掣科技资深数据库专家,前淘宝网、支付宝数据库专家
814 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已更新 20 讲/共 41 讲
MySQL 运维实战课
15
15
1.0x
00:00/00:00
登录|注册

18|读懂MySQL中的执行计划(上)

你好,我是俊达。
上一讲我介绍了数据库中最主要的几种访问路径,不同的访问路径,在执行性能上可能会存在巨大的差别。但是我们怎么知道某一个具体的 SQL 语句在执行时,采用了什么样的访问路径呢?这就涉及到 SQL 的执行计划了。执行计划描述了 SQL 语句的访问路径,通过执行计划,我们可以知道:
表上是否有可用的索引,SQL 执行时是否使用了索引,使用了哪些索引?
表连接的顺序是怎样的?
使用了哪种表连接算法,是用了 Nest Loop 还是 Hash Join?
查询是否用到了临时表,是否进行了文件排序?
在 MySQL 中,我们使用 Explain 命令查看语句的执行计划。这一讲中我会使用四十多个演示 SQL,来解释 EXPLAIN 输出信息的具体含义。至于为什么一个 SQL 使用了这个执行计划,而不是别的执行计划,我会在接下来的几讲中慢慢展开。
为了便于演示各种不同的执行计划,我使用了下面这些测试表和测试数据,你也可以在自己的环境中进行测试。
CREATE TABLE `digit` (
`a` tinyint NOT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB;
insert into digit values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
CREATE VIEW numbers AS
select a.a*1000 + b.a*100 + c.a*10 + d.a as n
from digit a, digit b, digit c, digit d;
-- 本章中大部分案例都使用tab表
CREATE TABLE `tab` (
`id` int NOT NULL AUTO_INCREMENT,
`a` int NOT NULL,
`b` int NOT NULL,
`c` int NOT NULL,
`padding` varchar(7000) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_abc` (`a`,`b`,`c`)
) ENGINE=InnoDB;
insert into tab (a,b,c,padding)
select n%3, n, n%100, rpad('x', 100, 'x')
from numbers where n < 10000;
-- t_merge主要用于演示index_merge的几种情况
create table t_merge(
id int not null auto_increment,
a int not null,
b int not null,
c int not null,
d int not null,
padding varchar(4000),
primary key(id),
key idx_ad(a,d),
key idx_bd(b,d),
key idx_cd(c,d)
) ENGINE=InnoDB;
insert into t_merge(a,b,c,d,padding)
select n % 3 + 1, n % 17 + 1, n % 19 + 1, n % 10 + 1, rpad('y', 100, 'y')
from numbers
where n between 1 and 3*17*19*10;
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. 执行计划描述了SQL语句的访问路径,包括表上是否有可用的索引、表连接的顺序、使用的表连接算法等。 2. 使用EXPLAIN命令可以查看SQL语句的执行计划,可以指定输出格式为traditional、json或tree。 3. 了解如何解读EXPLAIN输出信息,可以帮助优化SQL语句的执行性能,选择合适的访问路径和连接算法。 4. TYPE列显示查询单元的访问路径,可以根据TYPE列来判断查询单元是否使用了索引。 5. const表示查询最多返回1行记录,对主键或唯一索引的所有字段都使用常量等值匹配时,type为const。 6. eq_ref使用主键或唯一索引等值匹配时,对于组合主键、组合唯一索引,索引中的每一个字段都需要以等值匹配时,type才为eq_ref。 7. ref表示普通索引字段的等值匹配,或主键和唯一索引前缀字段上的等值匹配。 8. range使用索引字段上的范围条件查询数据,包括 `<, <=, >, >=, BETWEEN` 等条件。 9. index_merge会使用多个索引来查询数据,并将通过多个索引获取到的数据取并集或交集,得到最终的结果. 10. index_subquery是执行特定类型的子查询的一种方式,如果子查询中的表有合适的索引可以用来检索,则可以使用index_subquery执行路径.

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 运维实战课》
新⼈⾸单¥59
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部
文章页面操作
MAC
windows
作用
esc
esc
退出沉浸式阅读
shift + f
f11
进入/退出沉浸式
command + ⬆️
home
滚动到页面顶部
command + ⬇️
end
滚动到页面底部
⬅️ (仅针对订阅)
⬅️ (仅针对订阅)
上一篇
➡️ (仅针对订阅)
➡️ (仅针对订阅)
下一篇
command + j
page up
向下滚动一屏
command + k
page down
向上滚动一屏
p
p
音频播放/暂停
j
j
向下滚动一点
k
k
向上滚动一点
空格
空格
向下滚动一屏
播放器操作
MAC
windows
作用
esc
esc
退出全屏
⬅️
⬅️
快退
➡️
➡️
快进
空格
空格
视频播放/暂停(视频全屏时生效)