你会选择连表查询速度一般还是拆成多次查询速度飞快的数据库查询方法?

2015-06-04 04:58:04 +08:00
 cevincheung

比如:

select from a join b on a.x=b.x left join c on a.x=c.x

还是
select id from a
程序获取ids
select b where id in (ids)
select c where id in (ids)

23182 次点击
所在节点    MySQL
41 条回复
songw123
2015-06-04 10:47:56 +08:00
看情况,在实际环境中比较一下就行了,第一是速度,第二是数据库压力,第三是使用频度,选择最合适的就好,不过整体来说,很少用join了
lbp0200
2015-06-04 11:15:36 +08:00
如果数据库在内网,每次查询几百兆的数据,你就知道应该怎么做了。
zonghua
2015-06-04 11:41:05 +08:00
a join b和where condition 有什么不同?
yangqi
2015-06-04 12:20:30 +08:00
@zonghua 没有不同,不过where只能join两个表,而且只能inner join
yangqi
2015-06-04 12:23:06 +08:00
如果没办法优化关联索引那只能拆分查询了,不过说过了速度肯定没有优化过关联索引得快。

所以自己根据情况看着办吧
RemRain
2015-06-04 12:28:25 +08:00
如果 in 的集合不是特别大的话,习惯拆开来查询。前端扩容加机器就行;把各种处理和计算都压在数据库上的后果是,万一数据库抗不住,要扩容就吐血了
ivvei
2015-06-04 12:48:07 +08:00
@sujin190 你分步查出来了还不是得自己join。就实际查询量来说,你分步需要的数据还比join好了的多。
ivvei
2015-06-04 12:51:20 +08:00
楼主你这两种查询不等价。一个是横的,一个是竖的。
cevincheung
2015-06-04 12:58:17 +08:00
@CupTools

关联的几个表分别多少数据,并且表结构方便贴一下吗?或者看一下explain
pubby
2015-06-04 13:01:28 +08:00
@RemRain 同意

如果考虑到后期加入cache层的话,不join。
个人只在一些管理后台才会用复杂sql查询

另外 where in 在表上了百万级别后性能有问题
where in (1,2,3) 还不如 where id=1 union ... where id=2 union ... where id=3 快得多
当然list如果很长,需要另外想办法优化
cevincheung
2015-06-04 13:09:26 +08:00
@pubby
为何我想到了exists :any
sujin190
2015-06-04 13:40:18 +08:00
@ivvei 可是设计良好的话,单步的数据应该是非常小的,而且内网的话网络延迟应该在数毫秒内吧,就算单步十次也几十毫秒,而且相对来说是个稳定值
hylent
2015-06-04 17:29:55 +08:00
那么多join的话,基于主键的cache怎么用?
水平sharding之后,还怎么join?
每次查询几百兆的数据,这是在做啥么……,反正肯定不是web了吧?
cevincheung
2015-06-04 17:31:40 +08:00
@hylent so,你更倾向后者么?
hylent
2015-06-04 17:45:28 +08:00
@cevincheung
对,倾向后者。
但是有的时候,join是必须的,有些需要跨表的条件,只能join啊啊
ivvei
2015-06-05 11:55:22 +08:00
@sujin190 比如 select * from a join b on a.aid = b.bid. 拆成两步就是 select * from a 和 select * from b。
原本返回的结果集是交集,现在需要把两表的数据都传回来。这个数据量明显是增大了很多的。返回来之后还没完,你还得在本地再进行人肉匹配,找一种算法来把两次返回的内容中相同的部分找出来。


除非考虑对前端进行水平扩展降低数据库单点压力,我没看到使用单步的方式有多大好处。
cevincheung
2015-06-05 12:06:54 +08:00
@ivvei

ids = select b_id from b where condition xxxxx
data = select a_field from a where ids in (ids)


如果仅仅是select没有条件检索那肯定前者更好的
bash99
2015-06-05 16:40:22 +08:00
觉得第二种快的基本上是带排序之后,只需要TOP N结果的吧。
正常情况下第一种肯定比第二种快。
ivvei
2015-06-09 19:40:19 +08:00
@cevincheung 即便是带有条件的,你先查出id再查data,一样要多来回传一份id的数据。另外你修改了查询的内容。原本我举的例子里,所需要的data包含a,b两个表的数据。你现在这种情形只有表a的数据了。像这样的句子,你直接写 select a_field from a where ids in (select b_id from b where condition xxxxx) 也已足够,数据库的优化引擎选择的查询算法只会做得比你更好不会做得比你更差。
ivvei
2015-06-09 19:42:16 +08:00
@cevincheung one more thing, 有些数据库里, in 后面直接接 (id1,id2,id3...) 是有个数限制的。比如Oracle…… 限定1000个。超过1000就会出问题。而接一个子查询就没问题。

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

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

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

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

© 2021 V2EX