我正在构建一个相当大的统计系统,该系统需要允许用户请求给定过滤器集(例如日期范围)的统计信息.
例如这是一个简单的查询,返回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)正在使用它.
如果这不起作用,则对于大型数据集,group by趋于缓慢,您需要将摘要数据放入静态表/文件/数据库中.
有几种技术/库等可以帮助您执行数据的服务器端缓存. PHP Caching to Speed up Dynamically Generated Sites提供了一个非常简单但自我说明的示例.