php - 我的 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-messages
和student-messages-seen
。如果需要,我可以发布表格的结构。
上面的 SQL 语句需要 40 秒 (!) 才能运行!我知道那里有一堆嵌入的语句,但这真的很长。
我需要了解的是:
- 为什么这需要这么长时间?
- 如果我用 PHP 单独编写语句,整个过程会快得多。这是为什么?
- 我怎样才能加快这个过程?
解决方案
这是一个使用一组至少 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 的索引
推荐阅读
- typescript - vs-code:html中打字稿的语法高亮
- angular - 如何使用 shareReplay 缓存带有请求参数的 HTTP 响应
- node.js - 填充包含对另一个集合的引用的集合数组返回空数组
- github - 访问令牌过期后无法在 Github 中使用刷新令牌生成访问令牌
- javascript - React-Native fetch 问题,请赐教
- php - wordpress+docker+apache mod 代理重定向到 http://localhost
- c++ - 线程死锁(我认为)
- java - 膨胀类android.fragment.app.FragmentContainerView时出错,有人可以告诉我我缺少什么
- r - 为什么会有空白?
- ios - 为什么 Swift 在调试模式下这么慢