我有一个在 vBulletin 系统中运行的查询,它获取具有图像附件的最新线程以及它们的第一个附件 ID。
这是查询:
SELECT thread.threadid,
thread.title,
thread.postuserid,
thread.postusername,
thread.dateline,
thread.replycount,
post.pagetext,
(
SELECT attachment.attachmentid
FROM `vb_attachment` AS attachment
LEFT JOIN `vb_filedata` AS data
ON data.filedataid=attachment.filedataid
WHERE attachment.contentid=thread.firstpostid
AND attachment.contenttypeid=1
AND data.extension IN('jpg','gif','png')
AND data.thumbnail_filesize>0
ORDER BY attachmentid ASC
LIMIT 1
) AS firstattachmentid
FROM `vb_thread` AS thread
LEFT JOIN `vb_post` AS post
ON post.postid=thread.firstpostid
WHERE thread.forumid IN(331, 318)
HAVING firstattachmentid>0
ORDER BY thread.dateline DESC
LIMIT 0, 5
您可以在此处看到查询的解释结果:
问题:通常查询在 0.00001 秒内运行,所以几乎是立即运行,因为它是整体优化的查询,但是,在创建新线程后(即使线程不是来自论坛 ID 331、318),它需要 40 多秒(直接从MySQL GUI),甚至解释查询需要 2+ 秒!. 解释查询缓慢显示有关索引使用的相同结果。
运行相同的查询两到三遍后,它又恢复了正常速度。
如果有人能解释发生了什么,以及如何解决问题,我将不胜感激。
谢谢。