我正在为我的项目使用PHP-Mysql,我有一个包含更多30000行的表。
当我的代码访问该表时,请求时间太长。
我怎样才能获得更快的速度?或某种方式来做到这一点?
我正在使用Laravel 5.1。我的代码是这样的(不用担心是否正确):
Games::join('categories', 'categories.id_game', '=', 'games.id')->where('games.id', $id)
->select('games.*', 'categories.name')->get()->toArray();
表Games
包含更多30000行,我使用index
(id)表Games
。
更新:我一次只需要1~300条记录。但查询请求时间太长。我认为表games
中的问题有很多行。我找到了解决方案。我尝试了一些方法:为表index
设置games
,只需选择我需要的字段(游戏名称,类别名称)。
抱歉我的英文!
答案 0 :(得分:3)
protected $visible = ['id', 'name', 'age'];
如果您通过 toArray()或 toJson()方法序列化模型,则只能获得所需的信息。
答案 1 :(得分:1)
按照上述@miikes的建议使用分页。
id_game也被编入索引?如果没有索引那么。
如果使用Mysql Workbench尝试检查执行计划并相应调整。
答案 2 :(得分:0)
正如其他人已经说过的那样 - 最有可能的两种解释是:
需要很长时间才能读取,传输,处理30,000条记录并将其放入数组中。 (你可能也会看到PHP咀嚼了相当多的内存......)
某处缺乏索引。
使用EXPLAIN
可以识别缺少索引。我不会在这里详细介绍,你可以Google it。我首先仔细检查JOIN
上是否有适当的索引。
但您的查询实际上非常简单。因此,“感知”查询持续时间的可能性更大。 MySQL需要相对较长的时间来读取所有这些记录,将它们放入内存,格式化它们,通过TCP / IP堆栈传递它们,让PHP接收它们,将它们处理成数组等等。
考虑(正如其他人已经说过的)使用LIMIT
子句来减少返回的记录数。 (主键索引ORDER BY
将确保您始终获得给定LIMIT
语句的相同结果。)
最后(但我怀疑这是最低可能性):我们看不到表格结构。它们很宽吗?里面可能有BLOB
或TEXT
个字段?如果我们假设平均记录很大(比如2KB),则30,000条记录将是58MB的数据。首先在PHP中缓存一些较大的查找数据可能是合适的。
在我看来,你可能会陷入解决不存在问题的共同点。
您正在返回所有内容,但您实际上使用后续代码中的所有内容吗? (你已经说过你一次只需要300行。)
我曾经在一些非常庞大的数据库上工作过(因为我确信其他人也会回答) - 有时这是需要改变的问题,而不是解决方案。
数据库中的规范化在学术上是好的,但实际上可能非常糟糕。不要为了高效的汇总缓存而担心重复数据。考虑更改问题,以便减少必须处理的数据。通过事务安全存储过程强制更新和删除可以让您充分利用这两个方面。