[英]Query Caching in MySQL
我正在构建一个相当大的统计系统,它需要允许用户请求给定一组过滤器的统计数据(例如日期范围)。
这是一个简单的查询,返回10个结果,包括player_id和每个玩家所做的杀戮量:
SELECT player_id, SUM(kills) as kills
FROM `player_cache`
GROUP BY player_id
ORDER BY kills DESC
LIMIT 10
OFFSET 30
上述查询将结果偏移30(即结果的第3页')。 当用户然后选择“下一页”时,它将使用OFFSET 40而不是30。
我的问题是没有任何缓存,即使在同一数据集上使用LIMIT / OFFSET对,它也会重新执行SUM(),只是为了将结果偏移10倍。
上面的例子是一个更大的查询的简化版本,它只返回更多的字段,并且需要很长的时间(20+秒,并且只会随着系统的增长而变长)。
所以我基本上寻找一种解决方案来加速页面加载,通过在应用LIMIT / OFFSET之前缓存状态。
你当然可以使用缓存,但我建议缓存结果,而不是mysql中的查询。
但首先要确保a)您对数据进行了正确的索引, b)它正在被使用 。
如果这不起作用,因为对于大型数据集,分组往往很慢,您需要将摘要数据放在静态表/文件/数据库中。
有几种技术/库等可以帮助您执行数据的服务器端缓存。 PHP缓存加速动态生成的站点提供了一个非常简单但自我解释的例子。
您是否考虑过定期运行长查询并将所有结果存储在摘要表中? 可以快速查询摘要表,因为没有JOIN且没有GROUPings。 缺点是汇总表不是最新的电流。
我意识到这并没有解决LIMIT / OFFSET问题,但它确实解决了多次运行困难查询的问题。
根据数据更新的频率,数据仓库是一种直接的解决方案。 基本上你:
您可以使用不同的优化技术,但值得研究:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.