代码之家  ›  专栏  ›  技术社区  ›  nickf

mysql是否短路了order by子句?

  •  3
  • nickf  · 技术社区  · 14 年前

    给定此SQL:

    SELECT * FROM mytable ORDER BY mycolumn, RAND()
    

    假设 mycolumn 只包含唯一值(因此,包含足够的信息以执行 ORDER BY )mysql是否对操作短路,并跳过对其余部分的评估?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Andrey Frolov    14 年前

    我想这就是答案。MySQL使用不同的计划,不能执行延迟评估(o“短路”)。

    mysql> explain select * from avatar  order by id;
    +----+-------------+--------+-------+---------------+---------+---------+------+-------+-------+
    | id | select_type | table  | type  | possible_keys | key     | key_len | ref  | rows  | Extra |
    +----+-------------+--------+-------+---------------+---------+---------+------+-------+-------+
    |  1 | SIMPLE      | avatar | index | NULL          | PRIMARY | 8       | NULL | 28777 |       |
    +----+-------------+--------+-------+---------------+---------+---------+------+-------+-------+
    1 row in set (0.00 sec)
    
    mysql> explain select * from avatar  order by id, name;
    +----+-------------+--------+------+---------------+------+---------+------+-------+----------------+
    | id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows  | Extra          |
    +----+-------------+--------+------+---------------+------+---------+------+-------+----------------+
    |  1 | SIMPLE      | avatar | ALL  | NULL          | NULL | NULL    | NULL | 28777 | Using filesort |
    +----+-------------+--------+------+---------------+------+---------+------+-------+----------------+
    1 row in set (0.00 sec)
    mysql> explain select * from avatar  order by id, RAND();
    +----+-------------+--------+------+---------------+------+---------+------+-------+---------------------------------+
    | id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows  | Extra                           |
    +----+-------------+--------+------+---------------+------+---------+------+-------+---------------------------------+
    |  1 | SIMPLE      | avatar | ALL  | NULL          | NULL | NULL    | NULL | 28782 | Using temporary; Using filesort |
    +----+-------------+--------+------+---------------+------+---------+------+-------+---------------------------------+
    1 row in set (0.00 sec)
    
        2
  •  0
  •   newtover    14 年前

    经验表明,即使 mycolumn 是主键。