编写 SQL 你都有哪些优化原则和建议

2016-03-17 10:07:50 +08:00
 lyning
我想到了两条;
1 : 多表查询查询,数据量越小的表放最右边(亲测,是这么回事,但是不清楚原理,希望有朋友可以跟我讲一下在查询的过程中都发生了什么)。
2 :多表查询,特别对于数据量大的表,能先过滤先过滤在联查,这样可以减少笛卡尔积,提速不少。
最后抛一个疑问
现有 A B 两个表, A 表中有 150w 数据 , B 有 100 条
1: select a.id, b.id, count(b.id) from A a left join B b on a.bid=b.id and b.is_exists=1 group by b.id;
2: select a.id, b.id, count(b.id) from A a left join B b on a.bid=b.id where b.is_exists=1 group by b.id;
这两条 sql 的运行效率差好大, 1 的效率比 2 的效率慢了 3 倍(用 mysql 测试),网上查了一下资料说 left join 会产生一张临时表, on 条件是在临时表建立之间过滤, where 条件是在临时表建立之后再过滤,但是效率居然差那么多,这到底是怎么回事,有朋友可以帮我解决这个疑问吗?
2504 次点击
所在节点    MySQL
2 条回复
devinww
2016-03-17 16:28:42 +08:00
lyning
2016-03-18 09:46:48 +08:00
@devinww 不对,我测试了一下,虽然 left join 加上 where 效率很接近 inner join 但是明显 left join 在 on 条件的时候因为没有过滤,导致效率上稍稍比 inner join 差一点点

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/264103

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX