Php MySQL中的查询缓存
我正在构建一个相当大的统计系统,它需要允许用户请求一组给定过滤器(例如日期范围)的统计信息 e、 g.这是一个简单的查询,返回10个结果,包括玩家id和每个玩家的击杀数量:Php MySQL中的查询缓存,php,mysql,caching,Php,Mysql,Caching,我正在构建一个相当大的统计系统,它需要允许用户请求一组给定过滤器(例如日期范围)的统计信息 e、 g.这是一个简单的查询,返回10个结果,包括玩家id和每个玩家的击杀数量: SELECT player_id, SUM(kills) as kills FROM `player_cache` GROUP BY player_id ORDER BY kills DESC LIMIT 10 OFFSET 30 上述查询将结果偏移30(即结果的第三个“页面”)。当用户选择“下一页”时,将使用偏移量40而
SELECT player_id, SUM(kills) as kills
FROM `player_cache`
GROUP BY player_id
ORDER BY kills DESC
LIMIT 10
OFFSET 30
上述查询将结果偏移30(即结果的第三个“页面”)。当用户选择“下一页”时,将使用偏移量40而不是30
我的问题是,没有缓存任何内容,即使在同一个数据集上使用LIMIT/OFFSET对,它也会再次执行SUM(),只是为了将结果再偏移10倍
上面的例子是一个大得多的查询的简化版本,它只返回更多的字段,需要很长的时间(20多秒,并且随着系统的增长只会变得更长)
因此,我正在寻找一种解决方案,通过在应用限制/偏移量之前缓存状态来加速页面加载。您是否考虑过定期运行长查询并将所有结果存储在汇总表中?由于没有联接和分组,因此可以快速查询汇总表。缺点是汇总表不是最新的
我意识到这并没有解决限额/抵销问题,但它确实解决了多次运行困难查询的问题。根据数据更新的频率,数据仓库是一个简单的解决方案。基本上你:
当然可以使用缓存,但我建议缓存结果,而不是mysql中的查询 但首先,确保a)您对数据有正确的索引,b)它正在被使用 如果这不起作用,因为GROUPBY在处理大型数据集时速度较慢,则需要将摘要数据放在静态表/文件/数据库中
有几种技术/库等可以帮助您执行数据的服务器端缓存。提供了一个非常简单但不言自明的例子。不幸的是,由于查询过滤器的原因,这是不可能的。不同的过滤器必须再次执行长查询,这是我不得不接受的,但我只是试图解决限制/偏移问题。我唯一可以使用的方法是为每种类型的过滤器提供多个汇总表,这是无限的,因为日期范围可能是任意的。必须有某种方法来正确设计汇总表,使其符合您的过滤器需求。(可能是通过向所有相关筛选器的汇总表中添加更多字段)如何?使用日期范围过滤器,可能的查询数量是无限的!没有长查询的通用版本不进行日期筛选?这就是应该填充汇总表的内容。如果使长查询变慢的唯一原因是日期筛选,那么,是的,需要一种不同的方法。处理日期范围筛选器的摘要值的方法是为不同的时间点预先计算不同的摘要值。然后,根据您的查询,在摘要中查找计算出的值,然后在其中添加自那时起的增量。Delta的日期范围将小得多,您的总和处理速度将快得多。