【问题标题】:mySQL Inconsistent PerformancemySQL 性能不一致
【发布时间】:2010-06-12 21:17:04
【问题描述】:

我正在运行一个连接超过 500,000 行的各种表的 mySQL 查询。有时需要一秒钟,有时大约需要 15 秒!这是在我的本地机器上。我之前在其他密集查询中也经历过类似的不同时间,有人知道这是为什么吗?

谢谢

感谢您的回复 - 我正在使用适当的索引、内连接和左连接,并且在可能的 2 年发票期间内,WHERE 子句范围为一周。如果我不断改变它(所以大概查询结果没有被缓存)并重新运行,时间变化很大,即使没有。检索到的行数相似。服务器不忙。每分钟有几个预定的查询,但不密集,大约需要 200 毫秒。

解释计划显示,大约 2000 行的表始终被完全扫描。所以也许这些行有时会被缓存,或者索引可能被缓存 - 不知道索引可以被缓存。我将在关闭缓存的情况下重试。

再次编辑 - 查询缓存实际上已关闭,我正在使用 InnoDB,所以看起来增加 innodb_buffer_pool_size 是可行的方法

【问题讨论】:

  • 问题不够具体,无法提供有用的答案,请重构 :)

标签: mysql performance


【解决方案1】:

每次查询都一样?

根据您发布的内容很难判断。如果我们假设架构和数据没有改变,我猜想当查询很长时,您的机器上运行的其他东西可以解释差异。可能是内存状态不同,所以分页正在进行;防病毒程序正在运行;其他一些服务已经启动。无法回答。

【讨论】:

    【解决方案2】:

    尝试做一个

    优化表格

    这应该有助于刷新一些对查询计划器有用的数据。

    您没有给我们太多信息,如果您使用的是 MyISAM 表,可能是锁的问题。

    您使用的是 ANSI INNER JOIN 吗?基本一点,但不要使用“交叉连接”。这些是用逗号连接的,比如

    SELECT * FROM t1, t2 WHERE t1.id_t1=t2.id_t1
    

    您可能想尝试的最后一件事。增加缓冲区 (innodb)、key_buffers (myisam) 和一些查询缓存缓冲区。

    【讨论】:

      【解决方案3】:

      这里有一些常见的原因(除非你的服务器太忙)

      • 慢查询正在命中硬盘。在快速情况下,索引和数据已经缓存在 MySQL 或 OS 文件缓存中。

      • 检索数据被更新/插入锁定,对于 MyISAM 表,在某些情况下,只要有人在其中插入/更新数据,整个表就会被锁定。

      • 表统计信息已过期和/或选择了错误的索引。在桌子上运行analyzeoptimize 会有所帮助。

      • 您启用了查询缓存,获取缓存查询的结果很快,如果它不在缓存中,则获取它可能会很慢。尝试关闭查询缓存以检查查询是否总是很慢,如果它没有从缓存中获取。

      在任何情况下,您都应该在查询中显示EXPLAIN 的输出,以验证索引是否被正确使用——即使它们没有被正确使用,如果一切都在内存中,查询可能会很快,但如果它会停止运行需要打硬盘。

      【讨论】:

        猜你喜欢
        • 2017-08-01
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-18
        相关资源
        最近更新 更多