千万级单表 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 分钟了

5708 次点击
所在节点    程序员
48 条回复
netnr
2019-08-29 10:28:48 +08:00
给出一个彩票方案:两张表分别排序取前 100 条最大值,在比较时间,有相同的,恭喜你中奖了,机率很渺茫
Aresxue
2019-08-29 10:48:07 +08:00
@Breadykid 那二楼方案是最佳的,先把 a 和 b 的数据从数据库里取出来,然后在程序里做计算,计算量大的话大可以优化,应该能控制在比较短的时间,这个方案的可行性主要看你从数据库里取 a 和 b 的数据要多久,要是这一步都超过 3s 那就没得玩。
PS:合理的方案还是加索引,不让加索引是因为加索引的时候会锁表,会影响表的正常使用(涉及到该表的业务全都没无法使用),时间过长的情况下可能导致更严重的问题,整个数据库崩了都有可能(几率不大),加了索引后还要清理内存碎片对表进行分析优化,不然 CBO 可能不会及时得知变更,计算执行计划的成本的时候出现失误。和 DBA 商量商量趁哪天服务升级或夜深人静了服务没什么人使用的时候把索引给加上吧。
LuciferGo
2019-08-29 15:14:05 +08:00
每天抽对应日期的 AB 用户数据到中间表再做处理,相对直接查更快。这种大表没索引最终要么归档 要么还是要停一下加索引
luozic
2019-08-29 15:14:47 +08:00
视图里面可以得到汇总金额,后面就用代码算,计算机结果塞进去临时表来存。
jziwenchen
2019-08-29 16:05:26 +08:00
@Breadykid

你用 explain 工具可以看到啊 你的 SQL 用到临时表 , join 就没有啊; 明显会快;并且你单表查询都要 46s 怎么优化 SQL 都慢.
Breadykid
2019-08-30 17:41:05 +08:00
@aliipay 是的哇
aliipay
2019-08-30 17:55:23 +08:00
@netnr 有相同的日期也不一定和是最大
netnr
2019-08-30 18:34:34 +08:00
@aliipay 是的,考虑不周

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

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

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

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

© 2021 V2EX