【问题标题】:Avoid RAND() query from slow query log避免来自慢查询日志的 RAND() 查询
【发布时间】:2013-06-27 22:46:09
【问题描述】:

--log-queries-not-using-indexes开启时如何避免这个查询被记录?

(source of the query)

EXPLAIN SELECT  id,autor,description
FROM    (
        SELECT  @cnt := COUNT(*) + 1,
                @lim := 3
        FROM    testimonale
        ) vars
STRAIGHT_JOIN
        (
        SELECT  r.*,
                @lim := @lim - 1
        FROM    testimonale r
        WHERE   (@cnt := @cnt - 1)
                AND RAND() < @lim / @cnt

        ) i;

解释

id  select_type  table       type    possible_keys  key  key_len  ref  rows  Extra                         
1   PRIMARY      <derived2>  system                                    1                                   
1   PRIMARY      <derived3>  ALL                                       3                                   
3   DERIVED      r           ALL                                       8     Using where                   
2   DERIVED                                                                  Select tables optimized away  

【问题讨论】:

  • SET sql_log_bin = 0;查询 SET sql_log_bin = 1; ?
  • 也可以做 SET log_queries_not_using_indexes = 0;然后将其设置为 1 而不是您可能需要查找实际的 sql 变量名称,但它类似于上面的内容。
  • 你是在问如何让这个查询使用索引?
  • @yak 不,他现在要求停止将其记录为不使用索引的查询。但维护所有其他查询的日志
  • 查询高效,无需登录。我们每秒有一个很大的请求,我们浪费了很多时间来记录一个需要 0.000045 秒的查询。

标签: php mysql sql optimization


【解决方案1】:

我不知道禁用单个查询记录的任何可能性。 log_queries_not_using_indexes 是全局的,即时更改它会阻止记录任何并发查询(尽管我知道如果查询那么快,这不太可能)。

由于您实际上想降低此日志记录引起的负载,因此您可能想改用log_throttle_queries_not_using_indexes(仅在 v5.6.5 中添加)或min_examined_row_limit 服务器选项。

后者存在于会话级别。它可以在查询之前增加到一个大得离谱的值,而对并发连接没有影响。令人惊讶的是,不需要任何特殊权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多