MySQL多表关联查询优化
mysql 查询 优化 关联 多表
2023-06-13 09:11:52 时间
大家好,又见面了,我是你们的朋友全栈君。
背景
最近在对运营报表导出进行优化,总结了一些多表关联查询优化的点记录一下。
避免临时表
通过 Explain 分析 SQL 语句,尽量不要使用到临时表。GROUP BY (Explain具体详解,可以看这篇博客)
最容易造成使用临时表,GROUP BY 与临时表的关系 : 1. 如果GROUP BY 的列没有索引,产生临时表. 2. 如果GROUP BY时,SELECT的列不止GROUP BY列一个,并且GROUP BY的列不是主键 ,产生临时表. 3. 如果GROUP BY的列有索引,ORDER BY的列没索引.产生临时表. 4. 如果GROUP BY的列和ORDER BY的列不一样,即使都有索引也会产生临时表. 5. 如果GROUP BY或ORDER BY的列不是来自JOIN语句第一个表.会产生临时表. 6. 如果DISTINCT 和 ORDER BY的列没有索引,产生临时表. 如果业务需求没法更改,也不需要强制去掉临时表。
缩小数据范围
接下来进行优化第二步,将临时表缩小到最小范围。SQL 执行过程大体如下:
- 执行FROM语句
- 执行ON过滤
- 添加外部行
- 执行where条件过滤
- 执行group by分组语句
- 执行having
- select列表
- 执行distinct去重复数据
- 执行order by字句
- 执行limit字句
当两个表进行Join操作时,主表的Where限制可以写在最后,但从表分区限制条件不要写在Where条件中,建议写在ON条件或者子查询中。主表的分区限制条件可以写在Where条件中(最好先用子查询过滤)。示例如下:
select * from A join (select * from B where dt=20150301)B on B.id=A.id where A.dt=20150301;
select * from A join B on B.id=A.id where B.dt=20150301; --不允许
select * from (select * from A where dt=20150301)A join (select * from B where dt=20150301)B on B.id=A.id;
第二个语句会先Join,后进行分区裁剪,数据量变大,性能下降。在实际使用过程中,应该尽量避免第二种用法。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/138924.html原文链接:https://javaforall.cn
相关文章
- MySQL数据库存储设计优化技巧(mysql存储设计)
- 类型的优缺点MySQL中多索引类型的优势和劣势(mysql多索引)
- MySQL中Date类型的用法及优势(mysql的date类型)
- MySQL语句 TOP: 让查询更高效(mysql语句top)
- MySQL对象类型深入了解(mysql对象类型)
- MySQL掌握时间差:掌握查询技巧(mysql计算时间差)
- MySQL中利用分区表实现数据优化(mysql分区表)
- 关联查询MySQL实现一对多关联查询的基础知识(mysql一对多)
- MySQL如何创建表:一步一步指南(mysql如何创建表)
- 少慢查询MySQL如何减少慢查询(mysql减)
- MySQL多表查询笔试:挑战你的SQL技能(mysql多表查询笔试题)
- MySQL键表查询实战(mysql查询并键表)
- 极速部署,使用SAE MySQL数据库(saemysql数据库)
- MySQL索引:查询范围的精准利器(mysql索引查询范围)
- MySQL如何进行小数取整?(mysql小数取整)
- 数据同步MySQL数据库中从库数据同步实现(mysql 从库)
- MySQL中BLOB数据类型的解析方法(mysql中blob解析)
- MySQL批量提交优化C语言编程效率(c mysql批量提交)
- MySQL的两层嵌套查询优化方法(mysql 两层嵌套)