1

我有一个在 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+ 秒!. 解释查询缓慢显示有关索引使用的相同结果。

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

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

谢谢。

4

1 回答 1

0

MySQL 缓存查询的结果以允许它稍后更快地返回相同查询的结果。

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

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

  1. 将查询重组为没有子查询的连接。
  2. 将查询重组为多个查询。
  3. 返回更多您需要的数据,然后在您的应用程序中处理这些数据。
于 2013-02-21T09:24:13.447 回答