mysql索引排序规则_MySQL索引原理

mysql索引排序规则_MySQL索引原理开发过程中发现SQL一直filesort,所以研究一下到低怎么才能使用索引进行排序。

MySQL 索引排序

表结构和数据

CREATE TABLE `t1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  `c` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
	KEY `idx_a_b_c` (`a`,`b`,`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
id a b c
1 1 5 3
2 5 3 3
3 4 5 9
4 2 6 1
5 4 3 2
6 5 5 5
7 1 2 1
8 5 5 8
9 5 3 9
10 5 5 1
11 5 7 7

SQL

explain select * from t where a = 5 order by c desc;
-- type:ref
-- key:idx_a_b_c
-- ref:const
-- Extra:Using where; Using index; Using filesort

explain select * from t where a = 5 order by b desc;
-- type:ref
-- key:idx_a_b_c
-- ref:const
-- Extra:Using where; Using index

explain select * from t where a = 5 and c = 5 order by b desc;
-- type:ref
-- key:idx_a_b_c
-- ref:const
-- Extra:Using where; Using index

explain select * from t where a = 5 and b = 5 order by c desc;
-- type:ref
-- key:idx_a_b_c
-- ref:const,const
-- Extra:Using where; Using index

explain select * from t where a = 5 and b >= 5 order by c desc;
-- type:range
-- key:idx_a_b_c
-- ref:NULL
-- Extra:Using where; Using index; Using filesort

索引分析

通过观察联合索引的数据结构,很明显就能发现索引都是有序的,使用索引进行排序就是利用了这个特性。

mysql索引排序规则_MySQL索引原理

我们来观察 a = 5 的这一段索引,很容易就能发现,在 a 确定的情况下,b 是有序的,但c 是无序的。a 和 b 命中索引,a 和 c 不命中索引

mysql索引排序规则_MySQL索引原理

a,b 都确定的情况下,c 是有序的。a,b,c 命中索引

mysql索引排序规则_MySQL索引原理

这就是老生常谈的 最佳左前缀原则 也叫 最左前缀匹配原则

因此,要让排序项使用索引进行排序

第一个条件就是:where条件+排序项符合最佳左前缀原则

第二个条件:不能使用条件查询

这个也可以通过观察联合索引得出结论

a = 5 AND b >= 5 显然是无法保证 c 是有序的

mysql索引排序规则_MySQL索引原理

结论

要让order by 使用索引排序,需要至少满足以下条件:

  1. where条件+排序项符合最佳左前缀原则
  2. 不能使用条件查询

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5530.html

(0)
上一篇 2023-05-05
下一篇 2023-05-05

相关推荐

  • Python Dictionary: 帮助你管理和快速访问数据

    Python Dictionary: 帮助你管理和快速访问数据在Python中,字典是一种非常常用的数据类型。Python Dictionary和List、Tuple等数据类型一起被称为集合(Collections)。字典是一种key-value对形式的集合,其中key是唯一的,值value可以是任何数据类型(数字、字符串、列表、字典等等)。而且字典中的键值对是无序的。

    2024-01-01
    93
  • Python中%s的含义

    Python中%s的含义Python作为一门高级编程语言,拥有丰富的语法和内置函数,其中用到了%s这个概念。在Python中, %s是一种字符串格式化操作符,用于将不同类型的数据转换为字符串并以指定的格式输出。

    2024-07-02
    39
  • 数据可视化 – Marvin

    数据可视化 – Marvin链接:https://bdcc.bigdataedu.org/block/50(需账号登录)

    2022-12-19
    155
  • 3、MySql第三章,分库分表、MyCat概述及安装登录[亲测有效]

    3、MySql第三章,分库分表、MyCat概述及安装登录[亲测有效]MySql第三章,分库分表、MyCat概述及安装登录 先下定论,数据库优化顺序: 1、单库单表; 2、单库单表主从复制; 3、垂直分库; 4、水平分区; 5、水平分表; 一、概述 1、为什么要分库分…

    2023-03-05
    149
  • SQL 语句-partition by「建议收藏」

    SQL 语句-partition by「建议收藏」/****** ******/ 初始化数据 create table employee (empid int, deptid int, salary decimal(10, 2)) insert i…

    2023-01-25
    182
  • 如何备份mysql数据库_备份软件

    如何备份mysql数据库_备份软件先说一下为什么需要备份MySQL数据?
    一句话总结就是:为了保证数据的安全性。
    如果我们把数据只存储在一个地方,如果物理机器损坏,会导致数据丢失,无法恢复。
    还有就是我们每次手动修改线上数据之前,为了

    2023-06-09
    137
  • MySQL8开启ssl加密

    MySQL8开启ssl加密1 概述 MySQL从5.7开始默认开启SSL加密功能,进入MySQL控制台后输入status可以查看ssl的状态,出现下图表示在使用ssl: 另外,ssl加密需要密钥与证书,可以使用openssl…

    2023-02-10
    246
  • MVCC多版本并发控制的理解「建议收藏」

    MVCC多版本并发控制的理解「建议收藏」##前置知识 ###当前读与快照读 当前读 什么是当前读:读取的是最新的数据,不会读到老数据。 何时触发:update、insert、delete、select lock in share mode、

    2023-05-30
    142

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注