使 SQL 查询更快地优化为 return 结果
Make SQL query optimize to return result faster
我有一个 table 有数百万条记录。我想获取当前日期的前 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 秒或更短时间内更快地获得结果?
Is there any modification possible in the above query to make it faster to get results within 10-15 seconds or less?
不,您无法在查询中更改任何内容来弥补 table 上缺少的索引。每次您 运行 该查询时,MySQL 都必须查看 table 中的每一行,您说的是大约 8,000,000 行。索引使得 MySQL 只需要查看相关行的一小部分。
WHERE created LIKE "2022-03-15%"
-->
WHERE created >= "2022-03-15"
AND created < "2022-03-15" + INTERVAL 1 DAY
前者不是“可搜索的”,因为它必须将 DATETIME
转换为字符串才能执行 LIKE
。后者很可能非常有效地使用索引idx_created_userid
。
我有一个 table 有数百万条记录。我想获取当前日期的前 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 秒或更短时间内更快地获得结果?
Is there any modification possible in the above query to make it faster to get results within 10-15 seconds or less?
不,您无法在查询中更改任何内容来弥补 table 上缺少的索引。每次您 运行 该查询时,MySQL 都必须查看 table 中的每一行,您说的是大约 8,000,000 行。索引使得 MySQL 只需要查看相关行的一小部分。
WHERE created LIKE "2022-03-15%"
-->
WHERE created >= "2022-03-15"
AND created < "2022-03-15" + INTERVAL 1 DAY
前者不是“可搜索的”,因为它必须将 DATETIME
转换为字符串才能执行 LIKE
。后者很可能非常有效地使用索引idx_created_userid
。