首页 > 解决方案 > 我的 SQL 需要 40 秒才能运行,但 PHP 会更快地执行相同的操作。这是为什么?

问题描述

我有以下 SQL:

SELECT t1.thread,t1.sender,t1.recipient,t1.subject,
        (SELECT COUNT(*) FROM `student-messages-seen` WHERE messageID = t1.id) AS count,
        (SELECT id FROM `student-messages-seen` WHERE messageID = (SELECT MAX(id) FROM `student-messages` t3 WHERE t3.thread = t1.thread) AND userID = 4) AS seen,
        (SELECT ts FROM `student-messages` WHERE thread = t1.thread ORDER BY ID DESC LIMIT 1) AS ts
        FROM `student-messages` t1 
        WHERE (sender = 4 OR recipient = 4) 
        AND id = (SELECT MIN(id) FROM `student-messages` WHERE thread = t1.thread)
        GROUP BY thread ORDER BY ts DESC

有两张桌子,student-messagesstudent-messages-seen。如果需要,我可以发布表格的结构。

上面的 SQL 语句需要 40 秒 (!) 才能运行!我知道那里有一堆嵌入的语句,但这真的很长。

我需要了解的是:

  1. 为什么这需要这么长时间?
  2. 如果我用 PHP 单独编写语句,整个过程会快得多。这是为什么?
  3. 我怎样才能加快这个过程?

标签: phpmysqlsql

解决方案


这是一个使用一组至少 5 个子查询的查询,这是复制的 ;)。

我可以保证这个查询慢的原因与索引有关!请确保您为每个子查询查询也设置了正确的索引。通过在表中设置 INDEXES,您将激发您的表现

如果您使用的是 MYSQL,则可以使用 EXPLAIN 来获取有关索引的更多信息。

EXPLAIN SELECT 
    t1.thread,
    t1.sender,
    t1.recipient,
    t1.subject,
   (SELECT COUNT(*) FROM `student-messages-seen` WHERE messageID = t1.id) AS count,
   (SELECT id FROM `student-messages-seen` WHERE messageID = (SELECT MAX(id) FROM `student-messages` t3 WHERE t3.thread = t1.thread) AND userID = 4) AS seen,
   (SELECT ts FROM `student-messages` WHERE thread = t1.thread ORDER BY ID DESC LIMIT 1) AS ts
   FROM `student-messages` t1 
   WHERE (sender = 4 OR recipient = 4) 
   AND id = (SELECT MIN(id) FROM `student-messages` WHERE thread = t1.thread)
   GROUP BY thread ORDER BY ts DESC

需要确保此表具有 INDEX 集:

表学生信息

列发送者的索引

列收件人索引

列螺纹索引

表 student-messages-seen

列 messageID 的索引

列 messageID + 列 userID 的索引


推荐阅读