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

时间:2013-06-27 14:03:52

标签: php mysql sql optimization

如何在--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;

EXPLAIN

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  

1 个答案:

答案 0 :(得分:1)

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

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

后者存在于会话级别。在查询之前,它可能会增加到一个非常大的值,而不会影响并发连接。令人惊讶的是,不需要特殊的特权。