数据库的 join 查询,子查询,程序的循环语句哪个快一点?

2017-03-06 13:56:09 +08:00
 labasq

一: JOIN 连表查询

二:( select * from ***) 嵌套子查询

三:先查一条主表然后循环主表记录数据再查附表。

这几种哪个快一点?或者还有什么方法?

现在做 model 层的公共查库方法

每个方法我都 join 了十几张表,作为公共方法统一调用。

1888 次点击
所在节点    数据库
27 条回复
liangWL
2017-03-06 14:06:06 +08:00
用视图,或者你说的第一种应该是最快的
tianshuang
2017-03-06 14:08:23 +08:00
快不快 explain 下
yeyuexia
2017-03-06 14:10:09 +08:00
join 查询是最快的……你那种直接作 view 吧……
domty
2017-03-06 14:10:16 +08:00
join+索引
labasq
2017-03-06 14:34:00 +08:00
@liangWL
@yeyuexia

好,我试一下视图,不过视图有什么缺点没有?
labasq
2017-03-06 14:34:48 +08:00
@tianshuang

好多查询都 explain 嘛?
labasq
2017-03-06 14:35:31 +08:00
@domty

有时候中间表不做索引 - -!那样的效率?
yeyuexia
2017-03-06 14:45:42 +08:00
@labasq 除了不够灵活以外没什么缺点 一般常用的确定的复杂查询都建议用 view 来做的
其实 如果是做报表,为了效率等考虑,又不要求很高的实时性的话,还是建议用异步任务来生成专门的表。毕竟数据量大了之后 join 性能也很让人心碎……
ncisoft
2017-03-06 16:05:35 +08:00
你用什么数据库?
fantastM
2017-03-06 18:55:57 +08:00
3 是写两个 sql 的意思吗?拆分 sql 、子查询、连接查询的效率,没有肯定的答案,优化复杂 sql 的关键是索引。“最优”的索引有时比“好的”索引性能要好两个数量级......

另外,自己不清楚执行效率的 sql ,都应该 exlpain 一下。
tramedy
2017-03-06 18:57:54 +08:00
join + 索引,如果中间表没有索引,说明数据库索引设计有问题。除非中间表很小
mingyun
2017-03-06 23:18:13 +08:00
分开查询吧
ivvei
2017-03-06 23:59:31 +08:00
@labasq 别听嚷嚷着视图的人瞎扯…
labasq
2017-03-07 08:17:27 +08:00
@yeyuexia
用视图 是不是我在查询的时候 其实视图再自查一次?
labasq
2017-03-07 08:17:42 +08:00
@ncisoft
MySQL
labasq
2017-03-07 08:21:06 +08:00
@fantastM
是的,我通常是一条 join 过去,但我看到项目有人写 循环再 select ,
一个操作几十上百条 select 都有可能
labasq
2017-03-07 08:22:19 +08:00
@tramedy
好,那把所有关联加上索引
labasq
2017-03-07 08:22:31 +08:00
@mingyun
分开查询是说?
labasq
2017-03-07 08:22:59 +08:00
@ivvei
视图有什么缺点?请问下
ivvei
2017-03-07 09:04:09 +08:00
@labasq 视图没什么缺点。但是对于加快你的查询速度毫无不相干。

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

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

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

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

© 2021 V2EX