不知道给位是怎么处理的?能否给一些建议?主表是 45W 左右的数据,从表大概 8W 左右。
1
moodasmood 2019-06-06 17:43:17 +08:00
这么点数据,瞎 jb 操作都合理
|
2
moodasmood 2019-06-06 17:44:30 +08:00
最好业务层处理,查询 3 次,数据库层面不做任何拼表
|
3
securityCoding 2019-06-06 17:51:18 +08:00
做好索引 , 数据量不大的话单表 /连表都行的.
推荐 2 楼的做法 |
4
des 2019-06-06 17:52:09 +08:00 via Android
看情况吧,分开了好缓存
|
5
Tianao 2019-06-06 20:49:31 +08:00 via iPhone
#2 +1,不要在数据库层面搞骚操作,交给业务逻辑去做。
|
6
akira 2019-06-06 20:52:42 +08:00
a 连 b 连 c 的话 ,真不建议,一堆人搞不定的,
还不如按 2l 拆开来写 |
7
DreamSpace 2019-06-06 21:02:10 +08:00 via Android
@moodasmood #2 为什么要查 3 次呢?查 3 次感觉会比一次拉出来慢很多,还要消耗额外的连接数,组装数据时还会有内存和性能上的开销。
|
8
Leammin 2019-06-06 21:23:47 +08:00 via Android
@DreamSpace 一次查询的话其实就是把应用层的性能开销转移到了数据库层,但数据库层的资源非常宝贵,所以一般都在应用层处理。
|
9
Lighfer 2019-06-06 21:36:30 +08:00
@DreamSpace 数据库的可扩展性比上层应用差得多,因此资源也就要珍贵得多,上层应用开销大点问题不大,内存不够了,cpu 不够了,加机器就是了,相比较而言数据库就没那么简单了
|
10
leon0903 2019-06-06 21:44:58 +08:00
其实我也有一个疑问 都说在业务层自己拆开按照单表去查,但是这样的话如果有分页呢?还有就是假如第一次从 A 表中查出来有 100w 条数据,然后要把这 100w 条数据当作条件放到 B 表中去查询,这样的话生成的 sql(如 where id in(.........................................) )难道不会超出 mysql 限制吗(我知道 mysql 这个参数可以调整,但是这终究是一次很大的网络消耗,而且容易失败)?
|
11
7654 2019-06-06 21:53:09 +08:00
@akira #6 真的有这么惨的吗。。。。
内部有个 sql plus 执行的简单报表,定时执行,经常手撸 SQL,连接时间设置的越来越长,已经 600 秒了 |
12
razertory 2019-06-06 22:12:17 +08:00
三表 join,索引做好了没有问题的
|
13
sonyxperia 2019-06-06 22:49:47 +08:00
是不是问问你们的 DBA 啊
|
14
liprais 2019-06-06 23:00:52 +08:00
很少有人自己手写能比数据库跑的快的
mysql 除外,他的 join 本身就很烂 |
15
jiezhi 2019-06-06 23:07:34 +08:00 via iPhone
联表查过二十多张表……
四百多行的 SQL 语句😂,不过我是搞数据的 |
16
version 2019-06-06 23:13:53 +08:00
如果是 api 接口的一般拆 3 个 sql 再 redis 缓存
如果是数据统计.看业务吧.有些过滤可以是 redis 存 id 或者其它方式来过滤.再 sql.都可以. 具体看业务了.没有绝对的方法..为了性能还是为了好修改好写代码 |
17
msg7086 2019-06-06 23:18:03 +08:00
@DreamSpace 想一想数据库的扩展性和应用程序服务器的扩展性。
数据库做一个集群代价很高,但是应用程序服务器你随便搞个几千台都不是问题。 @leon0903 你什么查询需要在 B 里查 100 万条记录? 如果真的有那么大的数据量过滤,放到 MySQL 内部做也不会更快。 |
19
armysky 2019-06-07 21:20:10 +08:00 via Android
如果表之间的关联是能命中索引,当然是写表关联了
|
20
mushishi OP 还是觉得两张表 join,再处理数据好一点。
|