【发布时间】:2021-05-27 08:20:06
【问题描述】:
假设你有这样一张桌子:
表用户:
- userid(PK,用户的id)
- regdate(日期时间、注册日期)
- idprovince(地址省份的外部id)
如果我这样写一个查询:
选择 DATE_FORMAT(regdate,"%Y-%m-01") 作为 regmonth, 省内, 计数(用户 ID)为 num 从 用户 通过...分组 DATE_FORMAT(regdate,"%Y-%m-01"), idprovince这将正确生成一个分组结果,该结果将显示在任何给定月份和省份注册了多少新用户。
假设现在我想要每个省在任何给定月份的累计用户数(任何给定月份和省份的值应该是该月和该省的新用户的总和以及之前所有月份的相同省),我应该如何构建高效的查询?
我尝试过使用这样的子查询:
SELECT
DATE_FORMAT(regdate,"%Y-%m-01") as regmonth,
idprovince ,
(SELECT
COUNT(userid)
FROM
users AS counting_0_tbl
WHERE DATE_FORMAT(counting_0_tbl.regdate,"%Y-%m-01")<=DATE_FORMAT(users.regdate,"%Y-%m-01")
AND counting_0_tbl.idprovince = users.idprovince
) as num
FROM
users
GROUP BY
DATE_FORMAT(regdate,"%Y-%m-01"),
idprovince
它运行正常,但需要 AGES 才能运行,比如在 70k 行表上需要 70 多秒。
知道如何提高效率吗?
我越来越多地考虑坚持基本查询并在第二阶段进行累积,在代码中......
我使用的是 Mysql 5.5,但如果有用我可以升级到 MySQL 8。
感谢您的帮助!
【问题讨论】:
-
你能不能提供一个minimal reproducible example
-
而且,如果可以的话,我认为你应该趁机升级
-
@Strawberry 请问你为什么说我应该升级?是不是 v8 在服务器上重了很多?
-
更重?是的。重得多?不。优点远远大于缺点,但我确定我不需要在这里逐项列出。
标签: mysql performance grouping counting