避免从慢速查询日志中进行RAND()查询


Avoid RAND() query from slow query log

打开--log-queries-not-using-indexes时,如何避免记录此查询?

(查询来源)

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  

我不知道有任何可能禁用单个查询的日志记录。log_queries_not_using_indexes是全局的,动态更改它将阻止任何并发查询的日志记录(尽管我知道如果查询那么快,这是不可能的)。

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

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