MySql 查询需要很长时间 PHP
Posted
技术标签:
【中文标题】MySql 查询需要很长时间 PHP【英文标题】:MySql Query Takes A Long Time PHP 【发布时间】:2016-02-18 00:54:09 【问题描述】:我在 Laravel 中有以下 php 代码正在执行 mysql 查询:
DB::statement(DB::raw("SET @rownum = 0"));
$sql = "@rownum := @rownum+1 AS rank, id, clanid, name, location, level, exp, warslost, warstied, warwinpercent, warswon, playercount, score";
$clan = Clans::orderBy('clanid', 'asc')
->selectRaw($sql)
->take(7000)
->get();
此查询需要很长时间才能执行。
我在我排序的列以及许多其他查询的列上都有索引。
我该怎么办?
更新:
执行的查询:
SET @rownum = 0
select @rownum := @rownum+1 AS rank, id, clanid, name, location, level, exp, warslost, warstied, warwinpercent, warswon, playercount, score from `clans` order by `clanid` asc limit 7000
EXPLAIN EXTENDED
结果:
【问题讨论】:
你需要 7000 吗? 按照***.com/questions/14536165/… 的说明生成要发送到服务器的实际查询。将其与 EXPLAIN 的输出一起粘贴到上面。 @RuiLima 我想得到除了 7000 之外的所有东西已经需要很长时间了.. @SashaPachev 查看更新。 去掉行号的计算有区别吗?而且您的第二个查询似乎与第一个查询不同,ORDER BY
子句已更改。
【参考方案1】:
Shivam Paw 和我通过聊天进行了这项工作。事实证明,MySQL 查询本身的速度毕竟很快。但是,我们确定
print str_repeat('a', $size_of_mysql_result_set);
非常慢(大小约为 2.4M)。所以问题要么是网络 I/O(可能是托管服务提供商的限制),要么是 PHP 和 nginx 之间在从 PHP 提供大量输出时出现的问题。
更新:
此时的一些选项:
重新构建应用程序,使其不会一次获取 2+ MB。最初可能会抓取您需要立即显示的内容,然后在后台获取其余内容 - 或者更好的是,仅在用户真正需要时才获取它 在 Nginx 中启用压缩 (https://rtcamp.com/tutorials/nginx/enable-gzip/) 与您的托管服务提供商协商更好的带宽交易或寻找其他提供商【讨论】:
我想说,如果不是所有的共享托管服务提供商,大多数都限制了服务器资源 我在 VPS 上.. @maytham-ɯɐɥıλɐɯ 我能做些什么来解决它? 看起来您正在处理太多数据。我会做两件事之一 - 考虑为什么需要如此大的结果集并将结果集减少到您实际需要的内容,或者更新您的查询以处理额外的处理以返回您打算从 PHP 获得的实际结果。您基本上是在处理数据量与计算量。无论何时,只要您拥有如此庞大的结果集,您就会在某个地方付出代价。【参考方案2】:是否有任何情况下一次显示 7000 行? 如果你有大数据要显示,基本上在用户请求结果时分页列表。
因为没有人可以一次看到7000条数据^^;; 考虑从数据库中动态加载数据。
http://laravel.com/docs/5.1/pagination
【讨论】:
以上是关于MySql 查询需要很长时间 PHP的主要内容,如果未能解决你的问题,请参考以下文章