如何使用 php 和 mysql 优化这个简单的数据库和查询?
Posted
技术标签:
【中文标题】如何使用 php 和 mysql 优化这个简单的数据库和查询?【英文标题】:How can I optimize this simple database and query using php and mysql? 【发布时间】:2011-12-11 15:17:59 【问题描述】:我从数据库中提取了一系列(例如限制 72、24)游戏,根据这些游戏被评为最受欢迎。我有一个单独的表用于跟踪游戏数据,还有一个用于跟踪游戏的个人投票(评分从 1 到 5,每个游戏每个用户一票)。当该游戏在该游戏的所有评分投票中具有最高平均评分时,该游戏被视为“最受欢迎”或“更受欢迎”。少于 5 票的游戏不予考虑。以下是表格的样子(两张表格,“游戏”和“投票”):
games:
gameid(key)
gamename
thumburl
votes:
userid(key)
gameid(key)
rating
现在,我知道有一种叫做“索引”的东西,它可以通过预先查询我的表并构建一个单独的索引表来加速我的查询(我真的不知道......这只是我的印象) .
我还了解到,当多个查询可以压缩为一个更长的查询(我想包含连接和嵌套的 select 语句)时,mysql 运行速度最快。
但是,我目前没有使用索引,我正在进行多次查询以获得最终结果。
应该对我的数据库进行哪些更改(如果有的话——包括构建索引表等)?我的查询应该是什么样的?
谢谢。
【问题讨论】:
我们需要查看您使用的查询以帮助优化它们。 【参考方案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作为主键就可以了)
【讨论】:
在“like”后加回车,强制代码正确缩进。我愿意,但我没有“编辑”权限。 如果我错了,请纠正我,但您提供的查询中似乎没有任何顺序。 执行 SQL 失败:SQL SELECT gamename, AVG() FROM games INNER JOIN votes ON games.gameid = votes.gameid GROUP BY games.gameid HAVING COUNT()> =5 限制 0,25 失败:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '*) FROM games INNER JOIN votes ON games.gameid = votes.ga' 附近使用正确的语法 我编辑了查询以添加订单,并修复了平均值(我希望结果会是你所期望的:))) 很高兴能帮上忙。但是您应该阅读索引和说明以了解如何优化查询【参考方案2】:根据 MySQL 文档,当您在 table creation 指定主键时会创建一个索引。这一点值得一提,因为并非所有 RDBMS 的功能都是这样的。
我认为您的想法是正确的,您的“投票”表充当“游戏”和“用户”之间的桥梁,以处理多对多关系。只需确保“userid”和“gameid”在“votes”表中编入索引即可。
【讨论】:
【参考方案3】:如果您有权为您的表使用 InnoDB 存储,您可以在 gameid
上的 votes
表中创建 foreign keys,这将使用为您在 games
表中的主键创建的索引。然后,当您执行连接这两个表的查询(例如... INNER JOIN votes ON games.gameid = votes.gameid
)时,它将使用该索引来加快处理速度。
您对索引的理解基本上是正确的——它基本上创建了一个单独的查找表,它可以在执行查询时在后台使用。
使用索引时,使用EXPLAIN 语法很有用(只需在SELECT
前面加上EXPLAIN
即可尝试)。它给出的输出会显示可用于查询的可能键列表以及查询使用的键。这在优化查询时非常有用。
【讨论】:
谢谢,您的回答非常有用。您似乎对这个主题很了解..也许您可以提出一个可能对我有用的查询? Octopus-Paul 的回答中提供的特定查询(和索引)似乎会从您的问题中产生您所追求的内容。如果您有许多查询要考虑,那么如果您想了解有关索引的更多信息,链接(以及一般的 MySQL 文档)是一个很好的起点。 This article 有一个很好的使用索引和EXPLAIN
的动手示例。【参考方案4】:
索引是一种物理数据结构,用于帮助加快检索类型的查询;它不仅仅是一张桌子上的桌子-> 对一个概念有好处。另一个概念是索引在教科书后面的工作方式(唯一的区别是您的书的搜索关键字可能指向多个页面/匹配项,而索引搜索关键字仅指向一个页面/匹配项)。索引是由数据结构定义的,因此您可以使用 B+ 树索引,甚至还有哈希索引。它是从数据库的物理/内部级别进行的数据库/查询优化 - 我假设您知道您在 DBMS 的更高级别工作,这更容易。索引植根于内部级别,这使得数据库查询优化更加有效和有趣。
我从您的问题中注意到,您甚至还没有开发出查询。首先关注查询。事实上,在任何研究生或研究生数据库课程中,索引都属于数据库的维护,而不一定是开发。
另外注意。我见过很多人说,作为一项规则,让所有的主键索引。这不是真的。在许多情况下,主键索引会减慢数据库的速度。事实上,如果我们只使用主索引,那么应该使用哈希索引,因为它们比 B+ 树工作得更好!
总而言之,针对查询和索引提出问题是没有意义的。首先寻求有关查询的帮助。然后给定您的表(关系模式)和 SQL 查询,然后只有这样我才能建议您最好的索引 - 记住它的维护。开发为0,我们无法进行维护。
亲切的问候,
注意许多计算课程的研究生级别关于索引的大多数问题如下:我们给学生一个关系模式(即你的表)和一个查询,然后问:批判性地为以下表的查询建议一个合适的索引—— --> 如果他们没有查询,我们不能问这样的问题
【讨论】:
我是该网站的新手,不知道多部分问题不被接受。尽管皱着眉头,但我理解您关于在解决指数问题之前需要更多信息的观点(我只是希望答案中包含必要的先决步骤)。谢谢你。您提供了帮助和信息。 哦,不,我一点也不皱眉头。开发查询后,您可以研究查询并决定需要提升的部分。从那里您将决定索引是否合适以及使用哪种类型的索引。您需要记住,索引会消耗 DBMS 维护它的成本。以上是关于如何使用 php 和 mysql 优化这个简单的数据库和查询?的主要内容,如果未能解决你的问题,请参考以下文章