不知道大家有没有遇到过一个 sql 连了 7,8 张表

2017-03-04 13:32:59 +08:00
 chaleaoch
在实际的生产环境中,这样会带来很大的效率问题吗?
昨天面试一个大兄弟,单张表只有 7--8 万的记录.连 7,8 张表查询,需要 7--8 秒.我表示很差异.

当然了目前我所遇到过的最大连表只连三张,单表数据也不是很大.大概是一张几千,另一张几百万的样子.

不过很快就查出来了.
4164 次点击
所在节点    数据库
86 条回复
inrenping
2017-03-05 10:03:44 +08:00
不是一般都写成视图和表值函数么
chaleaoch
2017-03-05 12:00:49 +08:00
@eyp82
您说的先天不足应该就是只 erp 的业务坑爹吧?
chaleaoch
2017-03-05 12:01:31 +08:00
@eyp82
难道互联网 /电商项目就没有这么复杂的业务吗?
erp 也可以做成电商啊~!
(个人浅显理解.)
phx13ye
2017-03-05 14:56:39 +08:00
join 还好,笛卡尔积直接血崩
chaleaoch
2017-03-05 15:00:39 +08:00
@phx13ye
请问,那种情况下是笛卡尔积那种情况下不会?
phx13ye
2017-03-05 15:22:50 +08:00
@chaleaoch mysql 下,用`,` `[cross|inner] join` 指定两个表但是没有`on`,`using`等条件限制的话就会由内联接变成笛卡尔积啊

具体你自己看一下查询的行数是不是两表数据量 M*N 也可以判断
findex
2017-03-05 16:38:40 +08:00
@konakona 一开始用的 sql 链表结构,后来用的是同 id 结构,再后来用的是 nosql 结构。统一整体的就是每条记录都带一个 ID 。 现在在项目中用 sql 结构带 jsonp 数据类型。
我觉得吧,针对不同的需求用什么样的数据解决方案。如果是网游的话,肯定不能用这样的多表结构。设计的时候多留点数据也比重复查表效率高。
ivvei
2017-03-06 00:17:30 +08:00
@shijingshijing 你需要了解一下数据库的优化器。
ivvei
2017-03-06 00:18:45 +08:00
@konakona 子查询和 left join 又不等价,你是怎么拿到一块去比的?
torbrowserbridge
2017-03-06 08:32:40 +08:00
前几天刚遇到,同为 ERP 系统, 5 表 join ,之前查询 55 秒,加了一个索引只需要 0.025 秒
chaleaoch
2017-03-06 09:19:26 +08:00
@torbrowserbridge 感谢分享心得.
superkey
2017-03-06 09:39:03 +08:00
遇到最多的就是 6 张表,说到底都是数据库设计的时候留下的锅.
solaya
2017-03-06 09:43:47 +08:00
做 erp 遇到连很多张表
xvx
2017-03-06 09:58:17 +08:00
我这里 join 十几个的都很常见……
konakona
2017-03-06 11:20:05 +08:00
@ivvei 没毛病啊,他们做的事情是一样的,只是查询语句和查询方式(提供结果的过程)不同,还有他们的过表方式也不同。性价比就在这个地方。他们没有一定限定哪些情况必须用 LEFT JOIN 也没有限定哪些情况必须用子查询。大部分情况下,我都建议子查询,或者说,大部分被坑过的都用子查询了。 哎, talk is cheep ,不如 show 你的 code 。大家来看下可以优化的地方具体是怎么样的吧。
konakona
2017-03-06 11:22:54 +08:00
并非我不用 LEFT JOIN ,RIGHT JOIN ,UNION JOIN. 有以下几种情况我会用:
1. 框架支持 VIEWMODEL (其实就是帮我串接语句)
2. 表优化做的好
3. 每个表的数据量不超过 50w ,或者不太可能在 3 年内增长迅速(一些业务量低,偏向于静态数据,不怎么变化的);表数量大约在 5-8 个以为。


-。- 这样查询的效率仍然很高,而且开发快捷,易于维护。

经验告诉我们啥时候用啥……
konakona
2017-03-06 11:23:38 +08:00
我做的是教务系统,涉及到 9 个角色所操作的 4 个平台;以及 2 个 App 终端。业务量很大。
labasq
2017-03-06 14:04:49 +08:00
我 join 了十几个表啊?
labasq
2017-03-06 14:05:25 +08:00
我 join 了十几个表啊?
难道要用嵌套子查询,或者主表出来循环查附表、?
cncqw
2017-03-06 14:37:43 +08:00
为什么不先把单表数据查出来再用程序处理?

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

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

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

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

© 2021 V2EX