1

我真的可以使用一些帮助来优化我网站上用于显示排名的表格。我已经阅读了很多关于如何优化查询以及如何正确使用索引的内容,但即使在实施了我认为可行的更改之后,也几乎看不到任何改进。我的快速解决方案是仅使用前 100,000 名排名(每天更新并存储在不同的表中)来提高现在的速度,但我真的不喜欢这个选项。

所以我有一个表来存储用户的信息,如下所示:

表“缓存”:

id    (Primary key)
name
region
country
score

还有其他关于用户的变量被存储,但我认为它们在这里不相关,因为它们没有在排名中使用。

用户可以查看 3 个基本排名页面:

世界观:

SELECT cache name,region,country,score FROM cache ORDER BY score DESC LIMIT 0,26

区域视图:

SELECT name,region,country,score FROM cache WHERE region='Europe' ORDER BY score DESC LIMIT 0,26

和国家观点:

SELECT name,region,country,score FROM cache WHERE region='Europe' AND country='Germany' ORDER BY score DESC LIMIT 0,26

我已经尝试了几乎所有我能想到的索引组合来帮助减轻数据库的工作,虽然有些似乎有一点帮助,但我找不到一个只会为地区和国家查询返回 26 行的索引组合(使用只是一个关于“分数”的指数,世界排名正在飞速发展)。

我觉得我可能缺少一些基本的东西,任何帮助将不胜感激!

一点额外信息:缓存表目前大约 920 兆字节,总行数略多于 800,000 行。如果您可以使用更多信息,请告诉我。

4

3 回答 3

2

您的世界排名受益于分数索引,因为分数是查询中的唯一标准。它排序的逻辑顺序内置在查询中。所以这很好。

其他查询将受益于区域索引。然而,与@Matt 所指出的类似,地区、国家和分数的综合指数可能是最好的选择。请注意,键的三列应按地区、国家、分数顺序排列。

于 2010-08-12T00:40:46.713 回答
0

在国家、分数、地区上放置一个索引。太多的索引会减慢你的速度。

于 2010-08-12T00:34:12.143 回答
0

我们在谈论多少条记录?

我不是 SQL 专家,但在这种情况下,如果只是更改索引并没有解决问题。我会考虑使用表结构来看看我能获得什么性能提升。

缓存

id (pk)
LocationId (index)
name
score

地点

LocationId (pk)
CountryId (index) 也许
RegionId (index) 也许

国家

CountryId
名称

地区

RegionId
名称

地点

LocationId(主键) CountryId
RegionId

国家

CountryId 名称

地区

RegionId 名称

Procs 中的临时表允许您在每种情况下选择位置 ID。它将降低您遇到的问题的总体复杂性:您将排除 1 个查询计划,而不是 3 个。

付出的努力会很大,而且回报会一直持续到你完成,所以我建议先看看指数方法。

祝你好运

于 2010-08-12T01:13:17.730 回答