2013-02-21 184 views
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 

的解释查询,你可以在这里看到的结果:

enter image description here

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

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

如果有人可以解释发生了什么,以及如何解决问题,我将不胜感激帮助。

谢谢。

回答

0

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

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

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

  1. 将查询重组为无子查询的联接。
  2. 将查询重组为几个查询。
  3. 返回您需要的更多数据,然后在应用程序中使用这些数据做一些工作。
+0

谢谢你的建议。看来查询缓存是唯一可以解释这一点的东西。但是,我仍然不确定,因为“解释”显示子查询只使用一行,而主查询中只有100行,即使没有查询缓存,它也不应该运行得更快(至少没有45秒)? – 2013-02-21 12:38:11

+0

我接受你的答案,因为到目前为止还没有其他答案。无论如何,这似乎主要与MySQL表引擎,e,服务器版本等有关,所以每个人都有这样的问题应该尝试改变这些,看看会发生什么。 – 2013-02-25 15:35:09

+0

我发现MySQL子查询的行为比我认为他们应该慢得多。我不知道为什么。我避开它们。 – cja 2013-02-25 15:42:16