-1

我从数据库中提取了一系列(例如限制 72、24)游戏,根据这些游戏被评为最受欢迎。我有一个单独的表用于跟踪游戏数据,还有一个用于跟踪游戏的个人投票(评分从 1 到 5,每个游戏每个用户一票)。当该游戏在该游戏的所有评分投票中具有最高平均评分时,该游戏被视为“最受欢迎”或“更受欢迎”。少于 5 票的游戏不予考虑。这是表格的样子(两个表格,“游戏”和“投票”):

games:
gameid(key)
gamename
thumburl

votes:
userid(key)
gameid(key)
rating

现在,我知道有一种叫做“索引”的东西可以通过预先查询我的表并构建一个单独的索引表来加速我的查询(我真的不知道......这只是我的印象)。

我还读到,当多个查询可以压缩为一个更长的查询(我想包含连接和嵌套的选择语句)时,mysql 运行速度最快。

但是,我目前没有使用索引,我正在进行多次查询以获得最终结果。

应该对我的数据库进行哪些更改(如果有的话——包括构建索引表等)?我的查询应该是什么样的?

谢谢你。

4

4 回答 4

1

您计算每场比赛平均值的查询可能如下所示:

SELECT gamename, AVG(rating)
FROM games INNER JOIN votes ON games.gameid = votes.gameid
GROUP BY games.gameid
HAVING COUNT(*)>=5 
ORDER BY avg(rating) DESC
LIMIT 0,25

您必须在游戏和投票上都有一个关于 gameid 的索引。(如果您已将 gameid 定义为桌面游戏的主键,则可以)

于 2011-12-11T15:31:07.867 回答
0

根据 MySQL 文档,在创建时指定主键时会创建索引。这是值得一提的,因为并非所有 RDBMS 的功能都是这样的。

我认为您在这里的想法是正确的,您的“投票”表充当“游戏”和“用户”之间的桥梁来处理多对多关系。只要确保“userid”和“gameid”在“votes”表中被索引。

于 2011-12-11T15:29:58.207 回答
0

如果您有权为您的表使用 InnoDB 存储,您可以在表中创建外gameidvotes这将使用为表中的主键创建的索引games。然后,当您执行连接这两个表的查询(例如... INNER JOIN votes ON games.gameid = votes.gameid)时,它将使用该索引来加快速度。

您对索引的理解基本上是正确的——它基本上创建了一个单独的查找表,它可以在执行查询时在后台使用它。

使用索引时,使用EXPLAIN语法很有用(只需在前面加上SELECTwithEXPLAIN即可尝试)。它给出的输出会显示可用于查询的可能键列表以及查询正在使用的键。这在优化查询时非常有用。

于 2011-12-11T15:44:26.080 回答
0

索引是一种物理数据结构,用于帮助加快检索类型查询;它不仅仅是一张桌子上的桌子-> 对一个概念有好处。另一个概念是索引在教科书后面的工作方式(唯一的区别是您的书的搜索关键字可能指向多个页面/匹配项,而索引搜索关键字仅指向一个页面/匹配项)。索引是由数据结构定义的,因此您可以使用 B+ 树索引,甚至还有哈希索引。它是从数据库的物理/内部级别进行的数据库/查询优化 - 我假设您知道您在 DBMS 的更高级别工作,这更容易。索引植根于内部级别,这使得数据库查询优化更加有效和有趣。

我从您的问题中注意到,您甚至还没有开发查询。首先关注查询。事实上,在任何研究生或研究生数据库课程中,索引都属于数据库的维护,而不一定是开发。

另外请注意,我看到很多人通常说要创建所有主键索引。这不是真的。在许多情况下,主键索引会减慢数据库的速度。事实上,如果我们只使用主索引,那么应该使用哈希索引,因为它们比 B+ 树工作得更好!

总之,为查询和索引提出问题是没有意义的。首先寻求有关查询的帮助。然后给定您的表(关系模式)和 SQL 查询,然后只有这样我才能建议您最好的索引 - 记住它的维护。如果开发为 0,我们无法进行维护。

亲切的问候,

NB 在许多计算课程的研究生级别,关于索引的大多数问题如下:我们给学生一个关系模式(即你的表)和一个查询,然后问:批判性地为表上的以下查询建议一个合适的索引 - ---> 如果他们没有查询,我们不能问这样的问题

于 2011-12-11T16:47:48.663 回答