22|MySQL子查询优化策略
俊达
你好,我是俊达。
这一讲,我们来讨论子查询的一些优化策略。子查询是 SQL 很重要的一个能力,平时也不少见。
子查询的一个例子
早期 MySQL(5.5 以及更早的版本)对子查询的支持比较弱,使用子查询时容易遇到性能问题。
在 13 讲的思考题中,就有一个执行了几天都没有完成的 SQL。
上面这个 SQL 语句并不复杂,我们来构建一个测试表,准备一些数据,并做一些测试。使用下面这段 SQL 创建表,并写入 100 万行数据。
公开
同步至部落
取消
完成
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
《MySQL 运维实战课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论