美文网首页
mysql 索引扫描排序

mysql 索引扫描排序

作者: 秋元_92a3 | 来源:发表于2022-04-05 15:04 被阅读0次

mysql 的InnoDB引擎,使用的B+树索引结构,天生的就是有序的;由于这个特性,可以通过合理的使用索引,来避免额外排序操作带来的损耗。下面举例说明

create table rental
(
    rental_id    bigint   default 0 comment 'id',
    rental_date  datetime default now() comment '租赁日期',
    inventory_id bigint   default 0 comment '商品ID',
    customer_id  bigint   default 0 comment '顾客ID',
    staff_id     bigint   default 0 comment '员工ID',
    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)
);

我先来查询下5.25 进行租赁记录按照商品id排序

explain select *
from rental
where rental_date = '2020-05-25'
order by inventory_id;
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE rental null ref rental_date rental_date 6 const 1 100 Using index condition; Using filesort

通过explain知道,查询命中索引rental_date,但是同时使用到 filesort。虽然命中了索引,但是在查询的总损耗中,排序造成了额外的性能消耗。
那么,如果使用索引扫描代替排序的过,我们可以先看下排序时命中索引的规则。

索引的列的顺序和ORDER BY子句的顺序完全一致,并且所有列的排序方向(倒序或正序)完全一致时,MYSQL采用索引对结果进行排序。

根据上面的规则,从新梳理查询sql,如果想我的排序sql命中rental_date索引,那么我的sql应该是这样。

explain select *
from rental
where rental_date = '2020-05-25'
order by rental_date,inventory_id,customer_id;

执行结果

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE rental ref rental_date rental_date 6 const 1 100 Using index condition

可以看到,此时执行,没有using filesort。也就是使用索引扫描代替了结果排序的动作。

有一个点需要注意,当前导列为常量时,order by 子句不满足最左匹配原则,仍然可以命中索引。仍然以 rental_date (rental_date, inventory_id, customer_id)索引为例。也就是把列rental_date前置为条件的前提下,order by 最左边不是rental_date,也可以认为rental_date在,会命中索引。

explain select *
from rental
where rental_date = '2005-05-25'
order by inventory_id,customer_id;

执行结果与上面相同

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE rental ref rental_date rental_date 6 const 1 100 Using index condition

那么返回到第一条sql,如果sql不变,想让他走索引扫描代替排序操作,需要怎么做呢

CREATE INDEX rental_date_invent on rental(rental_date,inventory_id);

相关文章

  • 高性能的索引策略

    MySQL查询基础-查询执行过程 MySQL聚簇索引 MySQL覆盖索引 MySQL索引扫描排序 MySQL冗余和...

  • mysql 索引扫描排序

    mysql 的InnoDB引擎,使用的B+树索引结构,天生的就是有序的;由于这个特性,可以通过合理的使用索引,来避...

  • Mysql - ORDER BY详解

    0 索引 1 概述2 索引扫描排序和文件排序简介3 索引扫描排序执行过程分析4 文件排序5 补充说明6 参考资料 ...

  • OrderBy和索引的关系

    优化ordder by 先要了解mysql的排序方式第一种就是通过有序索引扫描直接返回有序数据,mysql> ex...

  • mysql order by 排序

    mysql order by 排序 索引排序 参考 order by 字段上上有索引可能就会用上索引排序,是否应用...

  • 「Mysql索引原理(八)」使用索引扫描做排序

    MySQL有两种方式可以生成有序的结果:通过排序操作;或者按索引顺序扫描;如果explain出来的type列...

  • DAY6:MySQL索引扫描排序

    一、MySQL有两种排序方式: 通过排序操作:将查找出来结果使用排序算法进行排序。 按索引顺序排序。 二、排序标志...

  • MySQL(4)应用优化

    MySQL应用优化 4.1-MySQL索引优化与设计 索引的作用 快速定位要查找的数据 数据库索引查找 全表扫描 ...

  • order by 和 索引

    1、 order by 排序字段和索引 2、 order by 排序字段对其他字段索引的影响 3、 mysql是怎...

  • MySQL中“order by”是怎么工作的?

    在使用explain分析查询的时候,索引扫描排序显示Using index/where。而文件排序显示Using ...

网友评论

      本文标题:mysql 索引扫描排序

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