首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL查询随机慢

MySQL查询随机慢
EN

Stack Overflow用户
提问于 2013-02-21 09:17:24
回答 1查看 309关注 0票数 1

我在vBulletin系统中运行了一个查询,该查询获取具有图像附件的最新线程以及它们的第一个附件ID。

以下是查询:

代码语言:javascript
运行
复制
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+秒!。“解释查询接受慢速”显示有关索引使用的相同结果。

在运行了两到三次相同的查询之后,它又回到了正常的速度。

如果有人能解释发生了什么,以及如何解决这个问题,我将感谢你的帮助。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-21 09:24:13

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

添加一个新线程将导致MySQL不得不在下次运行查询时重新构建查询缓存。

我发现MySQL子查询的性能很差。为了避免子查询,我使用了一些策略:

  1. 将查询重构为没有子查询的联接。
  2. 将查询重构为多个查询。
  3. 返回您需要的更多数据,然后在应用程序中处理这些数据。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14998440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档