MySQL查询随机慢

时间:2013-02-21 09:17:24

标签: mysql vbulletin

我在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

您可以在此处看到的查询说明结果:

enter image description here

问题:通常查询运行在0.00001秒,所以几乎立即,因为它是整体优化查询,但是,在创建新线程后(即使线程不是来自论坛ID 331,318 ) ,它需要40多秒(直接从MySQL GUI执行),甚至解释查询需要2秒以上!。解释查询慢速显示与索引使用相同的结果。

运行相同的查询两到三次后,它恢复到正常速度。

如果有人能解释会发生什么,以及如何解决问题,我将非常感谢您的帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

MySQL缓存查询结果,以便以后更快地返回相同查询的结果。

添加新线程导致MySQL在下次运行查询时必须重建查询缓存。

我发现MySQL子查询表现不佳。我用来避免子查询的一些策略:

  1. 将查询重组为不带子查询的连接。
  2. 将查询重组为多个查询。
  3. 返回您需要的更多数据,然后在您的应用程序中处理这些数据。