我有一个包含数百万条记录的表。我想获取当前日期的前10个收入者(通过对user_id进行分组并添加同一用户的earnings
字段值来计算(,我已经为此创建了以下查询。
SELECT user_id, SUM(earnings) AS earn
FROM statistics
WHERE created LIKE "2022-03-15%"
GROUP BY user_id
ORDER BY earn DESC
limit 10
查询给出了预期的结果,但问题是,处理和所有操作大约需要90秒。
在上述查询中是否有任何可能的修改,以使其在10-15秒内或更短时间内更快地获得结果?
WHERE created LIKE "2022-03-15%"
-->
WHERE created >= "2022-03-15"
AND created < "2022-03-15" + INTERVAL 1 DAY
前者不是";sargable";因为它必须将CCD_ 2转换成字符串来执行CCD_。后者可能非常有效地使用索引idx_created_userid
。
在上面的查询中是否可以进行任何修改,以使其在10-15秒内更快地获得结果?
不,查询中没有任何可以更改的内容来弥补表上索引的不足。每次运行该查询时,MySQL都必须查看表中的每一行,您说这大约是8000000行。索引使得MySQL只需要查看相关行的子集。