我在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秒以上!。解释查询慢速显示与索引使用相同的结果。
运行相同的查询两到三次后,它恢复到正常速度。
如果有人能解释会发生什么,以及如何解决问题,我将非常感谢您的帮助。
感谢。
答案 0 :(得分:0)
MySQL缓存查询结果,以便以后更快地返回相同查询的结果。
添加新线程导致MySQL在下次运行查询时必须重建查询缓存。
我发现MySQL子查询表现不佳。我用来避免子查询的一些策略: