1
我有一个查询在vBulletin系统中运行,该查询获取具有图像附件的最新线程及其第一个附件ID。MySQL查询随机缓慢
下面是该查询:
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秒钟!。解释慢速查询显示与索引使用相同的结果。
运行相同的查询两三次后,它恢复到通常的速度。
如果有人可以解释发生了什么,以及如何解决问题,我将不胜感激帮助。
谢谢。
谢谢你的建议。看来查询缓存是唯一可以解释这一点的东西。但是,我仍然不确定,因为“解释”显示子查询只使用一行,而主查询中只有100行,即使没有查询缓存,它也不应该运行得更快(至少没有45秒)? – 2013-02-21 12:38:11
我接受你的答案,因为到目前为止还没有其他答案。无论如何,这似乎主要与MySQL表引擎,e,服务器版本等有关,所以每个人都有这样的问题应该尝试改变这些,看看会发生什么。 – 2013-02-25 15:35:09
我发现MySQL子查询的行为比我认为他们应该慢得多。我不知道为什么。我避开它们。 – cja 2013-02-25 15:42:16