最近在做一个有关地理位置的应用,涉及到的逻辑比较复杂。其中一个表用于存储传感器的基本信息,另一个表存储传感器获得的数据点(这个表的数据相对于其他表来说比较大)。
为了获得用户所拥有的每一个传感器最近一次的数据的列表,我是用了一个带有多个JOIN的语句,并且用Group by来合并同一个传感器的数据,以此来找到每个传感器最近一条数据。但是现在有了几万条数据之后感觉查询有些慢。。。
大家认为这种情况下是使用Join好还是分开多次Select更好呢?
新手求轻喷……
1
slixurd 2015-05-29 10:36:46 +08:00 1
如果是为了让别人容易看懂可以分开多次select,每个select都写的尽可能简单,这样比较容易维护
不过用运行时间空间做标准的话,还是JOIN比较好,不过记得用子查询,不然笛卡尔积太大速度一样很慢 |
2
iam36 2015-05-29 10:40:34 +08:00 1
看过滤条件,只要有(就是where啦),肯定分开差效率高。
数据达到一定量级后结果就会有极大的差别 |
3
b821025551b 2015-05-29 10:42:33 +08:00 1
按照where落点数据的前几个字段做索引看看还慢不慢
|
4
yangqi 2015-05-29 10:45:36 +08:00 1
join肯定比多次select要好,当然前提是表和语句要优化好
|
5
zrp1994 OP @slixurd 确实有用子查询,但是主要是SQL Server的group by什么的和MySQL很不一样,所以加了好几个join和子查询,感觉对效率不放心,看样子还是要从现有的语句进行优化呀~
|
7
liprais 2015-05-29 10:50:36 +08:00 1
不知道你用的什么数据库,
如果是商业数据库的话,join基本上能优化的很好了,至少比你自己拆的好 mysql倒是不一定了。 p.s 一定要收集统计信息! |
9
otakustay 2015-05-29 11:06:49 +08:00
如果你的数据量会提升到需要分表甚至分库的程度,建议减少join。一但分表分库,join就玩不成了
|
11
FifiLyu 2015-05-29 11:28:33 +08:00
正在维护别人写的程序。sql慢查询非常多,我只想说:“能不能分开查询?不要用这么多join之类的联表查询?”
基本10个人访问页面,mysql就跑到600%左右的。哎! |
12
zhouquanbest 2015-05-29 11:30:43 +08:00 1
实习时发现的第一件事就是不让使用join
|
13
exuxu 2015-05-29 11:36:00 +08:00 1
心理想着select,敲着成了delete
|
14
Conte 2015-05-29 11:37:03 +08:00
=。= 新手什么的公司才不会让你用join 分分钟搞死一些东西
|
16
huijiewei 2015-05-29 11:41:53 +08:00
以前沉迷于使用复杂的 SQL 语句,现在还是喜欢把复杂的东西分拆为几个简单的。
|
17
loveyu 2015-05-29 12:18:00 +08:00
一般我如果有索引且不复杂的SQL直接join,复杂点的就分吧。当然看统计
|
18
Cloudee 2015-05-29 14:52:44 +08:00 via iPhone
explain一下看看执行计划,join的话一不小心就循环起来了
|
19
caoyue 2015-05-29 18:51:34 +08:00
既然是用SQL Server ,查询分析器还是用起来吧
|
20
bitzhuxb 2015-05-29 19:46:47 +08:00 1
感觉很简单呀~
做一个 子查询 计算出每个传感器的最近一条数据。 再做一个子查询 计算出 用户的所有传感器 然后利用 然后这两个子查询进行join. 两个子查询量已经很小了 |
21
koodai 2015-05-29 20:45:30 +08:00 via iPhone
join在mysql下性能差,不推荐,我在阿里云数据库的体验,子查询要极大提高性能。
原因不明所以。 |
24
coolcfan 2015-05-29 21:32:37 +08:00
我是跑测试的,不懂这块的具体技术细节,但是用 MySQL 的话,explain 一下,看到给出的那个表格里要是写了需要创建临时表的标记,那并发高一点 CPU 占用会很恐怖。
|
26
mingyun 2015-06-07 16:35:05 +08:00
楼主现在采用什么方案?有用吗
|