SQL 使用 Join 好还是多次 Select 好?

2015-05-29 10:17:50 +08:00
 zrp1994

最近在做一个有关地理位置的应用,涉及到的逻辑比较复杂。其中一个表用于存储传感器的基本信息,另一个表存储传感器获得的数据点(这个表的数据相对于其他表来说比较大)。
为了获得用户所拥有的每一个传感器最近一次的数据的列表,我是用了一个带有多个JOIN的语句,并且用Group by来合并同一个传感器的数据,以此来找到每个传感器最近一条数据。但是现在有了几万条数据之后感觉查询有些慢。。。
大家认为这种情况下是使用Join好还是分开多次Select更好呢?
新手求轻喷……

16413 次点击
所在节点    MySQL
30 条回复
slixurd
2015-05-29 10:36:46 +08:00
如果是为了让别人容易看懂可以分开多次select,每个select都写的尽可能简单,这样比较容易维护
不过用运行时间空间做标准的话,还是JOIN比较好,不过记得用子查询,不然笛卡尔积太大速度一样很慢
iam36
2015-05-29 10:40:34 +08:00
看过滤条件,只要有(就是where啦),肯定分开差效率高。

数据达到一定量级后结果就会有极大的差别
b821025551b
2015-05-29 10:42:33 +08:00
按照where落点数据的前几个字段做索引看看还慢不慢
yangqi
2015-05-29 10:45:36 +08:00
join肯定比多次select要好,当然前提是表和语句要优化好
zrp1994
2015-05-29 10:46:26 +08:00
@slixurd 确实有用子查询,但是主要是SQL Server的group by什么的和MySQL很不一样,所以加了好几个join和子查询,感觉对效率不放心,看样子还是要从现有的语句进行优化呀~
zrp1994
2015-05-29 10:47:18 +08:00
@iam36 嗯,有用到一些where和in,我觉着速度慢也有可能是in的问题
liprais
2015-05-29 10:50:36 +08:00
不知道你用的什么数据库,
如果是商业数据库的话,join基本上能优化的很好了,至少比你自己拆的好
mysql倒是不一定了。
p.s 一定要收集统计信息!
zrp1994
2015-05-29 10:55:35 +08:00
@liprais 谢谢提醒O(∩_∩)O
otakustay
2015-05-29 11:06:49 +08:00
如果你的数据量会提升到需要分表甚至分库的程度,建议减少join。一但分表分库,join就玩不成了
zrp1994
2015-05-29 11:08:56 +08:00
@otakustay 这个也是有可能的,如果真到那个地步了就要好好搞下缓存什么的了~~~
FifiLyu
2015-05-29 11:28:33 +08:00
正在维护别人写的程序。sql慢查询非常多,我只想说:“能不能分开查询?不要用这么多join之类的联表查询?”

基本10个人访问页面,mysql就跑到600%左右的。哎!
zhouquanbest
2015-05-29 11:30:43 +08:00
实习时发现的第一件事就是不让使用join
exuxu
2015-05-29 11:36:00 +08:00
心理想着select,敲着成了delete
Conte
2015-05-29 11:37:03 +08:00
=。= 新手什么的公司才不会让你用join 分分钟搞死一些东西
Conte
2015-05-29 11:37:18 +08:00
@Conte 我是对自己说的哈
huijiewei
2015-05-29 11:41:53 +08:00
以前沉迷于使用复杂的 SQL 语句,现在还是喜欢把复杂的东西分拆为几个简单的。
loveyu
2015-05-29 12:18:00 +08:00
一般我如果有索引且不复杂的SQL直接join,复杂点的就分吧。当然看统计
Cloudee
2015-05-29 14:52:44 +08:00
explain一下看看执行计划,join的话一不小心就循环起来了
caoyue
2015-05-29 18:51:34 +08:00
既然是用SQL Server ,查询分析器还是用起来吧
bitzhuxb
2015-05-29 19:46:47 +08:00
感觉很简单呀~
做一个 子查询 计算出每个传感器的最近一条数据。
再做一个子查询 计算出 用户的所有传感器

然后利用 然后这两个子查询进行join. 两个子查询量已经很小了

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

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

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

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

© 2021 V2EX