[英]MySQL query is extremely long from PHP
我有一个查询在 PHPMyAdmin 中需要 0.0002 秒,如果我从 PHP 执行它需要数百秒。 这里是:
SELECT id, id_pages, link, childlink, url, hiddencontent, cansearch,
(
SELECT p.id
FROM pages as p
WHERE pages.hiddencontent=1
AND p.id_pages IS NOT NULL
AND p.hiddencontent=0
AND pages.id=p.id_pages
order by p.npp asc
limit 1
) as id_firstchild
FROM pages
它返回大约 24k 行,我不知道为什么需要这么长时间。 我的朋友在他的电脑上试过,它运行得很快,他的电脑也不是更好。 我不知道这种 PHP 行为的原因,也许我应该在配置文件中进行一些更改?
每当您尝试确定搜索或获取是否缓慢时,请在查询末尾使用LIMIT 1
(如果有的话,注释掉ORDER BY
部分)。 这样,您将获得第一行,因此您将知道这需要多长时间。 它应该很快就会燃烧起来。
另一个有用的信息是当您将整个查询包含在另一个查询中时,例如SELECT...FROM (SELECT...)
,在这种情况下,外部查询应该计算返回的行数。 这将为您提供识别将要获取的所有行所需的总时间,但不会实际获取它们。 这有助于确定您的 SQL 查询是否写得不好,或者只是需要获取大量数据。 (如果上述 go 都快,但查询仍然很慢,那就是 fetch。)
您还可以使用EXPLAIN
来查看您的性能问题是否是由于索引不足或不正确造成的。
至于 phpmyadmin,您帖子上的第一条评论几乎总结了它:phpmyadmin 使用 LIMIT 因此即使您的查询本身很慢,它也会运行得更快。
你有两个问题:
为什么是时机?
“查询缓存”是否打开? 这是它可以在 0.2 毫秒内运行的唯一方法。 (几乎可以肯定,在 1ms 内运行的任何重要的 SELECT 都没有运行,但在该缓存中找到了。)
而且,正如其他人指出的那样, phpmyadmin 默默地添加了一个LIMIT
。 然而,其他线索(主要在评论中)指向查询缓存给出异常结果。
如何加快速度。
SELECT id, id_pages, link, childlink, url, hiddencontent, cansearch,
if (hiddencontent = 1, NULL, -- to avoid doing the SELECT
( SELECT p.id
FROM pages as p
WHERE p.hiddencontent = 0
AND outer.id = p.id_pages -- fails on NULL
order by p.npp asc
limit 1
)) as id_firstchild
FROM pages AS outer -- clarify which is which
并有这个“复合”和“覆盖”索引:
INDEX(hiddencontent, id_pages, npp, id)
两个改进:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.