繁体   English   中英

MySQL 查询从 PHP 开始非常长

[英]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)

两个改进:

  • 避免在不需要时调用子查询。
  • 有一个索引,允许子查询只查看一行,并且只在索引的 BTree 中,因此“非常快”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM