如何优化这个简单的数据库和查询使用PHP和MySQL?

问题描述:

我从一个数据库中提取了一个范围(例如限制72,24),根据这个数据库,这个数据库已经被评为最受欢迎。我有一个单独的表格用于跟踪游戏数据,另一个用于跟踪游戏中的单个投票(评分从1到5,每位用户每场比赛投一票)。当该游戏具有所述游戏的所有评分投票的最高平均评分时,游戏被认为是“最受欢迎”或“更受欢迎”。不少于5票的游戏未被考虑。下面是桌子的样子(两张桌子,“游戏”和“投票”):如何优化这个简单的数据库和查询使用PHP和MySQL?

games: 
gameid(key) 
gamename 
thumburl 

votes: 
userid(key) 
gameid(key) 
rating 

现在,据我所知,有一些所谓的“指数”,它可以通过基本预加快我的查询查询我的表格并构建一个单独的索引表(我真的不知道......这只是我的印象)。

我也读过,当多个查询可以压缩成一个更长的查询(包含联接和嵌套选择语句,我假设)时,mysql运行速度最快。

但是,我目前不使用索引,并且我正在进行多个查询以获得最终结果。

应该对我的数据库做些什么修改(如果有的话 - 包括构建索引表等)?我的查询应该是什么样子?

谢谢。

+0

我们需要查看您正在使用的查询来优化它们。 –

+0

感谢您的反馈,但我想优化的是我的多个查询集,它们与他们应该完全不同。更重要的是,我发现当我没有为其他人提供不必要的代码来简单混搭并称为“优化”时,我获得的功能更少,质量也更低。 – dan

你的查询计算平均每场比赛可能看起来像:

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 

您必须对两场比赛和投票游戏ID的索引。 (如果你定义了游戏ID作为桌上游戏的主键,这是无妨)

+0

在“like”之后添加回车符以强制代码正确缩进。我会,但我没有“编辑”权限。 – Aaron

+0

纠正我,如果我错了,但似乎没有任何您提供的查询中的顺序。 – dan

+0

无法执行SQL:SQL SELECT gamename,AVG(*)FROM games INNER JOIN votes ON games.gameid = votes.gameid GROUP BY games.gameid HAVING COUNT(*)> = 5 limit 0,25 failed:You have an error在你的SQL语法中;检查与您的MySQL服务器版本相对应的手册,以在'*)附近使用正确的语法FROM line INNER JOIN votes ON games.gameid = votes.ga'at line 1 – dan

根据MySQL文档,当您在table creation处指定主键时会创建一个索引。这值得一提,因为不是所有的RDBMS的功能都是这样。

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

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

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

使用索引时,使用EXPLAIN语法很有用(只需在SELECT前加上EXPLAIN即可试用)。它提供的输出显示了可用于查询的可用键列表以及查询使用的键。这在优化查询时非常有用。

+0

谢谢,您的回答非常丰富。你似乎对这个主题非常了解。也许你可以建议一个可能适合我的查询? – dan

+0

Octopus-Paul的答案中提供的具体查询(和索引)似乎会产生你的问题。如果你有很多需要考虑的问题,那么如果你想了解更多关于索引的知识,那么链接(和一般的MySQL文档)是一个很好的开始。 [本文](http://www.databasejournal.com/features/mysql/article.php/1382791/Optimizing-MySQL-Queries-and-Indexes.htm)有一个很好的动手实例,使用索引和'EXPLAIN '。 – cmbuckley

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

我注意到你的问题,你甚至还没有开发查询。首先关注查询。作为一个事实,索引是在任何研究生或研究生数据库课程之后进行的,索引编制属于数据库的维护范围,不一定是开发。

也N.B.我已经看到很多人认为所有主键索引都是通用的。这不是真的。有很多情况下主键索引会降低数据库的速度。事实上,如果我们只使用主索引,那么应该使用散列索引,因为它们比B +树更好地工作!

总之,对于查询和索引提出问题是没有意义的。首先请求帮助。然后给你的表(关系模式)和SQL查询,然后才可以建议你最好的索引 - 记住它的维护。如果有0发展,我们不能做保养。

亲切的问候,

N.B.关于许多计算课程研究生水平的索引的大多数问题如下:我们给学生一个关系模式(即你的表)和一个查询,然后问:严格地为表中的下列查询提供一个合适的索引 - - >如果他们没有查询,我们不能问这样的问题

+0

我是新来的网站,并没有意识到多部分的问题是不被接受的。不管皱眉如何,我在理解索引问题之前需要更多信息(我只是希望将必要的先决条件步骤包含在答案中)中理解你的观点。谢谢。你一直有帮助和信息。 – dan

+0

哦,不,我一点也不皱眉。在查询开发完成后,您将研究查询并确定您需要提升的部分。从这里开始,您将决定索引是否合适以及要使用的索引类型。你需要记住一个索引消耗了DBMS维护它的成本。 –