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

相关推荐

  • mongodb存储形式_innodb的存储引擎

    mongodb存储形式_innodb的存储引擎一、MongoDB的存储引擎概述 存储引擎(Storage Engine)是MongoDB的核心组件,负责管理数据如何存储在硬盘(Disk)和内存(Memory)上。从MongoDB 3.2 版本开始

    2023-02-16
    154
  • Python字典:高效处理和存储数据

    Python字典:高效处理和存储数据Python字典是一种灵活而高效的数据类型,用于存储和管理各种数据,包括数字、字符串、列表等。在本文中,我们将从多个方面探讨Python字典的优势、使用方法和应用场景等细节。

    2023-12-18
    123
  • SQL优化很难怎么办?给你一个简单暴力的办法

    SQL优化很难怎么办?给你一个简单暴力的办法今天给大家带来一个比较简单SQL优化案例,来分析一下开发人员经常感到不解一个问题——视图合并导致的SQL变慢 例如: 一个运维人员(这里的运维指的是,在现有的系统上,进行稍微修改) 因为业务上的改变…

    2022-12-21
    140
  • 工具 | 一条 SQL 实现 PostgreSQL 数据找回

    工具 | 一条 SQL 实现 PostgreSQL 数据找回作者:张连壮 PostgreSQL 研发工程师 从事多年 PostgreSQL 数据库内核开发,对 citus 有非常深入的研究。 快速找回丢失数据,是数据库的一项重要功能需求,一般建议使用官方推荐的

    2023-04-29
    149
  • mssql sqlserver 如何编写case when 多条件呢?「建议收藏」

    mssql sqlserver 如何编写case when 多条件呢?「建议收藏」摘要: 下文讲述case when中多条件的编写方法,如下所示: 实验环境:sql server 2008 R2 case when 多条件编写方法 case when多条件编写语法: case wh

    2022-12-21
    136
  • Python 中如何反转字符串?

    Python 字符串是 Unicode 字符的集合。Python 有很多字符串操作的函数,但是 Python 字符串库不支持内置的“reverse()”函数。但是有各种方法来反转弦。我们正在定义以下方法来反转 Python 字符串。

    2023-08-24
    126
  • 使用ctrl+f11快速运行Python程序

    使用ctrl+f11快速运行Python程序Python作为一门高级的编程语言,编写程序需要输入很多代码,而且每次执行程序都需要打开命令行或者Python IDE,这样会非常麻烦。但是,Python提供了一种快捷键来运行程序,就是使用ctrl+f11。通过这个快捷键,我们可以非常方便地运行Python程序。

    2024-06-30
    44
  • redis实现主从复制「建议收藏」

    redis实现主从复制「建议收藏」前面说到了redis在单机的模式下是可以数据持久化的,但是不可以解决单点失败的问题,当单台redis服务器出现问题时,就可能会造成数据的丢失;想要解决这个问题的话我们可以使用Redis的主从模式这也是

    2023-06-13
    186

发表回复

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