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

22|MySQL子查询优化策略

你好,我是俊达。
这一讲,我们来讨论子查询的一些优化策略。子查询是 SQL 很重要的一个能力,平时也不少见。

子查询的一个例子

早期 MySQL(5.5 以及更早的版本)对子查询的支持比较弱,使用子查询时容易遇到性能问题。
在 13 讲的思考题中,就有一个执行了几天都没有完成的 SQL。
Command: Query
Time: 184551
State: Sending data
Info: select item_id, sum(sold) as sold
from stat_item_detail
where item_id in (
select item_id
from stat_item_detail
where gmt_create >= '2019-10-05 08:59:00')
group by item_id
上面这个 SQL 语句并不复杂,我们来构建一个测试表,准备一些数据,并做一些测试。使用下面这段 SQL 创建表,并写入 100 万行数据。
create table stat_item_detail(
id int not null auto_increment,
item_id int not null,
sold int not null,
gmt_create datetime not null,
padding varchar(4000),
primary key(id),
key idx_item_id(item_id),
key idx_gmt_create(gmt_create)
) engine=innodb;
create view digit
as select 0 as a union all select 1 union all select 2 union all select 3
union all select 4 union all select 5 union all select 6
union all select 7 union all select 8 union all select 9 ;
create view numbers_1m AS
select ((((a.a * 10 + b.a)*10 + c.a)*10 + d.a)*10+e.a)*10+f.a as n
from digit a, digit b, digit c, digit d, digit e, digit f;
insert into stat_item_detail(item_id, sold, gmt_create, padding)
select n + 1000000 - n % 2 as item_id,
n % 100 - n%100%2,
date_add('2024-06-01 00:00:00', interval n minute) as gmt_create,
rpad('x', 1000, 'abcdefg ') as padding
from numbers_1m;
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. MySQL 5.6引入了半连接转换,优化器会自动进行查询转换,不需要手动改写SQL。 2. 优化器会根据语句的具体情况,选择合适策略来执行半连接,包括pullout、duplicate weedout、first match、loose scan、materialization。 3. 反连接(ANTI Join)在MySQL 8.0.17开始对not in、not exists查询进行转换优化。 4. 使用not in时,要注意子查询中不要出现null的数据,这会导致查询不到任何数据。 5. MySQL中,子查询可以出现在Where条件中,一般以exists、not exists、in、not in的形式出现。 6. 有些情况下,MySQL无法使用半连接转换来自动优化子查询,比如当子查询出现在select的列表中,或者子查询中使用了聚合函数。

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

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部