千万级单表 sql 查询问题

2019-08-28 14:33:12 +08:00
 Breadykid

划重点:单表 3500w

单表查
表 [用户]
字段 [用户名,金额,日期时间]
查每天同一时间用户 A 和用户 B 金额之和的最大值
如果不用

	
SELECT
	max( a.金额 + b.金额 ),
	a.日期时间 
FROM
	( SELECT 金额,日期时间 FROM 用户表 WHERE 用户名 = 'a' ) a
	LEFT JOIN ( SELECT 金额,日期时间 FROM 用户表 WHERE 用户名 = 'b' ) b 
    	ON a.日期时间 = b.日期时间

该怎么写,不能加索引
上面这个 sql 查得特别慢,近 1 分钟了

5455 次点击
所在节点    程序员
48 条回复
wlkq
2019-08-28 17:33:31 +08:00
2 楼的方法算最优解了吧,又不能加索引
IamUNICODE
2019-08-28 17:45:13 +08:00
想知道为什么不能加索引,把理由说出来,我这好早做准备。。
onepunch
2019-08-28 17:50:50 +08:00
@IamUNICODE 加索引会锁表,数据越多时间越长,生产环境不允许停机那么长时间,如果是自己的电脑那无所谓了
hhhzccc
2019-08-28 18:10:04 +08:00
再加一张临时中间表,
nthhdy
2019-08-28 18:22:15 +08:00
为啥不能加索引
arthas2234
2019-08-28 18:32:12 +08:00
一般这种大表,不会涉及修改数据的话,做归档处理。你现在加也不迟,先实现个功能拆表,后面再实现需求
jowenzzzzz
2019-08-28 18:33:42 +08:00
看不懂这个代码,同一时间求最大值,没 group by,同一时间是天?同一时间是否有多条记录?
luozic
2019-08-28 19:42:06 +08:00
mysql 还是别的,mysql 拆表,别的 oracle postgresql 倒是有不少骚操作。
jzmws
2019-08-28 20:44:31 +08:00
4000w 的数据不多呀 ! 增加硬件陪着
lilongn1
2019-08-28 21:09:21 +08:00
Select max(sum(金额) )
from user
where 用户 in (‘ a ’,’ b ’)
group by 日期
reus
2019-08-28 22:13:50 +08:00
@onepunch 建从库,加了索引,再切换主从……
Breadykid
2019-08-29 09:21:26 +08:00
@shyrock 生产环境不让随便加索引 [无话语权的小兵开发的功能不该涉及索引
Breadykid
2019-08-29 09:23:03 +08:00
@jziwenchen 你这个和我的有什么本质的区别吗?
Breadykid
2019-08-29 09:24:46 +08:00
@Aresxue 产品希望这个查询接口执行时间不超过 3s,无论用一条 sql 还是代码里操作
Breadykid
2019-08-29 09:27:32 +08:00
@shadow88sky 木有 es,哭哭
Breadykid
2019-08-29 09:28:06 +08:00
@1762628386 梦做得不错
Breadykid
2019-08-29 09:31:54 +08:00
@luozic 用的 mysql,不过我很喜欢 pg 的哇,想问 pg 有什么骚操作哇
aliipay
2019-08-29 10:05:23 +08:00
每日计算前一天加和最大值的定时任务
---------------------
是所有 ab 用户组合都事先算好?
IamUNICODE
2019-08-29 10:08:04 +08:00
@onepunch 我懂了,原来是这原因,那我得先做好准备了。。
hjq98765
2019-08-29 10:16:48 +08:00
在做 a 表和 b 表的子查询的时候,应该是各做了一次用户表的全表扫描,如果以后只看 a 和 b 两个用户的话,可以先生成一个临时表 where 用户名 in ('a','b'),然后再在这个 ab 表上分别查 a 和 b,可以少一次用户表的全表扫描

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

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

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

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

© 2021 V2EX