【问题标题】:MySQL - force not to use cache for testing speed of queryMySQL - 强制不使用缓存来测试查询速度
【发布时间】:2010-09-15 23:07:47
【问题描述】:

我正在测试 MySQL 中某些查询的速度。数据库正在缓存这些查询,这让我在测试这些查询的速度时很难获得可靠的结果。

有没有办法禁用查询缓存?

系统:Linux 虚拟主机上的 MySQL 4,我可以访问 PHPMyAdmin。

谢谢

【问题讨论】:

    标签: mysql


    【解决方案1】:

    尝试在查询中使用SQL_NO_CACHE (MySQL 5.7) 选项。 (MySQL 5.6用户点击HERE

    例如。

    SELECT SQL_NO_CACHE * FROM TABLE
    

    这将停止 MySQL 缓存结果,但请注意其他操作系统和磁盘缓存也可能会影响性能。这些更难解决。

    【讨论】:

    • 一篇关于 mysql 查询缓存的好文章。如何设置和查看缓存的运行情况!值得一读。 databasejournal.com/features/mysql/article.php/3110171/…
    • 在尝试提高性能之前,请尝试重新启动您的 mysql 服务器。可能是某个过程正在影响一切。它发生在我身上。虽然是与问题没有直接关系的评论,但可以帮助很多人。
    • 这会阻止它缓存结果,但它是否也会阻止它使用缓存?
    • @Brett 早在 11 年就看到 SalmanPK 的评论。该文档页面实际上是 4 个句子,直接回答您的问题。万一该页面将来被删除:“它既不检查查询缓存以查看结果是否已缓存,也不缓存查询结果。”
    【解决方案2】:

    只影响当前连接的另一种选择:

    SET SESSION query_cache_type=0;
    

    【讨论】:

    • 我的错。我在看的是query_cache_size,而不是query_cache_type。我把你的答案和 SeniorDev 的答案混在一起了。
    【解决方案3】:

    对当前日期/时间的任何引用都将禁用该选择的查询缓存:

    SELECT *,NOW() FROM TABLE
    

    请参阅“使用 MySQL 查询缓存的先决条件和注意事项”@http://dev.mysql.com/tech-resources/articles/mysql-query-cache.html

    【讨论】:

      【解决方案4】:

      还有配置选项:query_cache_size=0

      要在服务器启动时禁用查询缓存,请将 query_cache_size 系统变量设置为 0。通过禁用查询缓存代码,没有明显的开销。如果您从源代码构建 MySQL,则可以通过使用 --without-query-cache 选项调用 configure 来完全从服务器中排除查询缓存功能。

      http://dev.mysql.com/doc/refman/5.1/en/query-cache.html

      【讨论】:

        【解决方案5】:

        您也可以运行以下命令来重置查询缓存。

        RESET QUERY CACHE
        

        【讨论】:

        • 这可能有点矫枉过正......理想情况下,您只希望 MySQL 暂时忽略缓存。
        • 您还需要特殊权限。
        【解决方案6】:

        一个问题

        SELECT SQL_NO_CACHE * FROM TABLE
        

        方法是它似乎只防止查询结果被缓存。但是,如果您正在查询一个正在与您要测试的查询一起使用的数据库,那么其他客户端可能会缓存您的查询,从而影响您的结果。我正在继续研究解决这个问题的方法,如果我找到了,我会编辑这篇文章。

        【讨论】:

        • 但是如果你的缓存被别人填满了,你会得到快的错觉。但有时不会。
        【解决方案7】:

        我会使用以下内容:

        SHOW VARIABLES LIKE 'query_cache_type';
        SET SESSION query_cache_type = OFF;
        SHOW VARIABLES LIKE 'query_cache_type';
        

        【讨论】:

          【解决方案8】:

          在查询中使用用户定义的变量会使查询结果不可缓存。我发现它比使用SQL_NO_CACHE 更好。但是你应该把变量放在变量设置不会严重影响性能的地方:

          SELECT t.*
          FROM thetable t, (SELECT @a:=NULL) as init;
          

          【讨论】:

          • “我发现它比使用 SQL_NO_CACHE 更好。”为何如此?似乎你需要一个非常有力的案例来对显式关键字使用晦涩的破解,除非显式关键字没有按照它声称的那样做。
          • @Air 我发现这个解决方案也比 SQL_NO_CACHE 工作得更好。 SQL_NO_CACHE 第一次运行查询时工作,但之后它就不再工作了。我假设这是由于其他缓存机制造成的。我认为这更有效,因为依赖于变量的搜索不能被任何层或机制缓存——至少,这是我最好的猜测。
          • 赞成。对我来说,SQL_NO_CACHE/*!40001 SQL_NO_CACHE */ 与常规查询相比没有任何区别。但是,使用, (SELECT @a:=NULL),我可以看到查询持续时间增加了 50%。无论如何,这并不能避免操作系统/磁盘缓存。见伊恩的回答。尽管如此,还是一个值得改进的地方。谢谢!
          【解决方案9】:

          如果您想禁用查询缓存,请将 'query_cache_size' 在 mysql 配置文件中设置为 0。如果设置为 0 mysql 将不会使用查询缓存。

          【讨论】:

            【解决方案10】:

            虽然有些答案很好,但有一个重要的警告。

            可能会阻止 mysql 查询被缓存,但它不会阻止您的底层操作系统缓存磁盘访问到内存。对于某些查询来说,这可能会大大减慢速度,尤其是当它们需要从旋转磁盘中提取数据时。

            因此,虽然使用上述方法很好,但我也会尝试每次使用一组不同的数据/范围进行测试,这可能不会从磁盘拉到磁盘/内存缓存中。

            【讨论】:

              【解决方案11】:

              您必须更改 SQL 字符串。因为 SQL 字符串是缓存键。 例如,为 SQL 注释添加时间戳。

              PHP 函数:

              function db_RunSQL($SQL, $NoCacheMode=false)
              {
              $SQL = (($NoCacheMode) ? '/*'.time().'*/ ' : '') . $SQL;
              return mysqli_query(db_SavedConnect(), $SQL);
              }
              

              【讨论】:

                猜你喜欢
                • 2011-03-13
                • 1970-01-01
                • 2018-07-30
                • 2017-05-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-04-28
                • 2023-03-16
                相关资源
                最近更新 更多