MySQL多表关联查询优化sql server2012使用教程
背景fgets函数运用
最近在对运营报表导出进⾏优化,总结了⼀些多表关联查询优化的点记录⼀下。
避免临时表
通过 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 执⾏过程⼤体如下:
1. 执⾏FROM语句
2. 执⾏ON过滤
3. 添加外部⾏
4. 执⾏where条件过滤
5. 执⾏group by分组语句
6. 执⾏having
7. select列表
xposed模块大全
mysql语句多表查询
8. 执⾏distinct去重复数据
9. 执⾏order by字句
10. 执⾏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,后进⾏分区裁剪,数据量变⼤,性能下降。在实际使⽤过程中,应该尽量避免第⼆种⽤法。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。