美文网首页MySQL学习笔记程序员
DAY6:MySQL索引扫描排序

DAY6:MySQL索引扫描排序

作者: 蚂蚁窝大梦想 | 来源:发表于2018-07-27 17:20 被阅读9次
    一、MySQL有两种排序方式:
    • 通过排序操作:将查找出来结果使用排序算法进行排序。
    • 按索引顺序排序。
    二、排序标志及原理说明
    • 排序标志
      EXPLAIN出来的type=index,则说明MySQL使用索引扫描来做排序。
    • 原理
      扫描索引本身是很快的,因为只需从一条索引记录移动到紧接着的下一条记录。
      但如果索引不能覆盖查询所需的全部列,那就不得不每扫描一条索引记录就回到表查询一次对应的行。这基本就是随机I/O,因此按索引顺序读取数据的速度通常比顺序地全表扫描慢,尤其是在I/O密集型的工作负载时。
    三、索引扫描排序条件

    索引的列顺序和ORDER BY 字句的顺序完全一致,并且所有列的排序方向(倒叙或正序)都一样时,MySQL才能够使用索引来对结果做排序。

    查找中关联多张表,则只有当ORDR BY引用的字段全部为第一个表时,才能使用索引做排序。

    ORDER BY 子句和查找型查询限制一样:需满足索引的最左前缀的要求;否则,MySQL都需要执行排序操作,而无法利用索引排序。

    前导列为常量,则不必满足最左前缀原则。即WHERE字句或JOIN字句中对这些列指定常量。

    四、案例

    已知表结构

    CREATE TABLE rental{
        ...
        PRIMARY KEY(rental_id),
        UNIQUE KEY rental_date(rental_date, inventory_id, customer_id),
        KEY idx_fk_inventory_id(inventory_id),
        KEY idx_fk_customer_id(customer_id),
        KEY idx_fk_staff_id(staff_id),
        ...
    };
    
    • 案例一:前导列常量
    EXPLAIN SELECT rental_id, staff_id FROM sakila.rental 
    WHERE rental_date = '2005-05-5'
    ORDER BY inventory_id, customer_id\G
    
    输出结果:
             type:ref
    possible_keys: rental_date
              key: rental_date
             rows: 1
            extra: using where
    ------
    前导常量2
    EXPLAIN SELECT rental_id, staff_id FROM sakila.rental 
     WHERE rental_date > '2005-05-5'
     ORDER BY rental_date, inventory_id, customer_id\G
    

    相关文章

      网友评论

        本文标题:DAY6:MySQL索引扫描排序

        本文链接:https://www.haomeiwen.com/subject/awwmmftx.html