繁体   English   中英

在MySQL中查询缓存

[英]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问题,但它确实解决了多次运行困难查询的问题。

根据数据更新的频率,数据仓库是一种直接的解决方案。 基本上你:

  1. 使用类似的表结构构建第二个数据库(数据仓库)
  2. 优化数据仓库数据库,以便以您想要的形状获取数据
  3. 定期(例如每天过夜)将数据从您的实时数据库复制到数据仓库
  4. 使页面从数据仓库中获取其数据。

您可以使用不同的优化技术,但值得研究:

  1. 删除不需要报告的字段
  2. 向现有表添加额外索引
  3. 添加新表/视图,汇总您需要的形状的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM