MySQL 联合索引底层存储结构及索引查找过程解读

前言

  • 大家好,我是 Lorin ,联合索引(Composite Index)又称复合索引,它包括两个或更多列。与单列索引不同,联合索引可以覆盖多个列,这有助于加速复杂查询和过滤条件的检索。联合索引的列顺序非常重要,因为查询优化器会按照索引列的顺序执行搜索。
  • 本文将从联合索引基本概念、底层存储结构、索引查找过程、实践建议几个方面图文并茂进行详细介绍。

版本

代码语言:sql

复制

SELECT VERSION();5.7.36-log

数据准备

SQL

代码语言:sql

复制

// 创建表
CREATE TABLE `test_table_union_index` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`merchant_id` int(20) NOT NULL,`order_id` int(20) NOT NULL,PRIMARY KEY (`id`),KEY `merchant_id_order_id_union_index` (`merchant_id`,`order_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;// 插入数据
INSERT INTO `test_table_union_index` (`merchant_id`, `order_id`) VALUES (3, 1);
INSERT INTO `test_table_union_index` (`merchant_id`, `order_id`) VALUES (3, 2);
INSERT INTO `test_table_union_index` (`merchant_id`, `order_id`) VALUES (4, 3);
INSERT INTO `test_table_union_index` (`merchant_id`, `order_id`) VALUES (4, 3);
INSERT INTO `test_table_union_index` (`merchant_id`, `order_id`) VALUES (5, 1);
INSERT INTO `test_table_union_index` (`merchant_id`, `order_id`) VALUES (5, 2);// 查询 SQL EXPLAIN 分析
EXPLAIN SELECT * FROM test_table_union_index WHERE merchant_id = 3 AND order_id = 2;

数据创建结果

  • SQL 执行完成后,我们可以看到数据库存储了如下数据:

SQL执行后生成的数据

SQL执行后生成的数据

有无联合索引执行情况

代码语言:sql

复制

// 查询 SQL EXPLAIN 分析
EXPLAIN SELECT * FROM test_table_union_index WHERE merchant_id = 3 AND order_id = 2;
无联合索引

无联合索引分析

无联合索引分析

存在联合索引

创建联合索引后分析

创建联合索引后分析

底层存储结构

底层存储结构

底层存储结构

  • 上图是联合索引 “merchant_id_order_id_union_index” 的底层存储结构(不一定和 MySQL 数据库底层实现完全一致),我们可以看到除了具有单列索引的特点外,联合索引还具有以下一些特点:

代码语言:sql

复制

- B+树通过索引首列值构建,如 merchant_id_order_id_union_index 根据 merchant_id 构建。
- 叶子节点拥有联合索引中的所有字段以及主键字段,且叶子节点数据局部有序,如我们有一个三个字段的联合索引(a,b,c):
叶子节点(1):
a,b,c(1,3,3)
a,b,c(1,3,4)
a,b,c(1,4,1)
a,b,c(1,4,2)叶子节点(2)
a,b,c(2,3,3)
a,b,c(2,3,4)
a,b,c(2,4,1)
a,b,c(2,4,2)a 列在B+树整体有序,a 列相同的情况下 b 列数据按序排列,但 c列不一定有序。

查询过程

最左匹配原则

  • 联合索引遵循最左匹配原则,只能从左往右依次搜索联合索引字段,否则索引字段不生效。

代码语言:txt

复制

例如索引是 key_index (a,b,c)。 可以支持 a 、a,b 、a,b,c 3种组合进行查找,但不支持 b,c 、c 进行查找。

查询过程解析

联合索引数据查询过程

联合索引数据查询过程

代码语言:sql

复制

SELECT * FROM test_table_union_index WHERE merchant_id = 3 AND order_id = 2;
  • 联合索引遵循最左匹配原则,以上述查询 SQL 为例,联合索引先根据 merchant_id = 3 在构建的B+树索引上进行查询数据,找到叶子节点:

叶子节点 3

叶子节点 3

  • 然后根据 order_id = 2 查询定位数据,查询到数据对应的主键 ID = 2,最后进行回表查询。

联合索引优势

支持复杂查询

  • 联合索引能够加速包含多个条件和多个列的查询。这对于联接多个表或需要在多列上进行过滤的查询非常有用。

索引覆盖查询

  • 联合索引可以覆盖多个查询中的列,从而减少了数据库的I/O负载。这意味着数据库不必访问数据行,而可以直接使用索引来满足查询条件。

提高排序和分组性能

  • 如果你的查询需要排序或分组结果,联合索引可以在这方面提供显著的性能改进,特别是当排序或分组涉及索引中的列时。

减少索引数量

  • 使用联合索引可以减少索引的数量,这对于大型数据库来说是一个重要考虑因素,因为每个额外的索引都会增加数据库维护的开销。

使用建议

联合索引的列顺序十分重要

  • 确定哪些列应包括在联合索引中,以及它们的顺序非常重要。通常将最频繁用于过滤条件的列放在索引前面。

建议能使用联合索引尽量使用联合索引

  • 应该尽可能使用联合索引,但联合索引无法满足需求时可以结合单列索引使用。

常见问题分析

为什么遵循最左匹配原则

  • 从联合索引的底层存储结构我们可以知道,联合索引是根据字段从左往右组织的,不从左边的字段开始查询无法使用索引。

联合索引中字段范围查询为什么会导致后续联合索引字段可不用

  • 从联合索引的底层存储结构我们可以知道,叶子节点数据局部有序,下面的案例可以清楚饿展示这个问题:

代码语言:txt

复制

假设存在如下数据:
1(b=1,c=4,d = 10)
2(b=2,c=5,d = 6)
3(b=2,c=5,d = 7)
4(b=3,c=1,d = 2)
5(b=3,c=5,d = 1)查询条件: b > 1 且 c = 5 , d = 6先查找 b > 1 :
2(b=2,c=5,d = 6)
3(b=2,c=5,d = 7)
4(b=3,c=1,d = 2)
5(b=3,c=5,d = 1)再查找 c = 5 , 此时 c 并不是有序的,因此无法使用联合索引字段 c,而是需要遍历所有4条数据(如果是有序:1,2,3,4,5,6,7,8 查找到5后就不再扫描):
2(b=2,c=5,d = 6)
3(b=2,c=5,d = 7)
5(b=3,c=5,d = 1)综上所述:联合查询中范围查询会导致后续字段数据无序,导致联合索引中后续索引字段失效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1559695.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

接口测试-day3-jmeter-2组件和元件

组件和元件: 组件:组件指的是jmeter里面任意一个可以使用的功能。比如说查看结果树或者是http请求 元件:元件指是提对组件的分类 组件的作用域:组件放的位置不一样生效也不一样。 作用域取决于组件的的层级结构并不取决于组件的…

GIS前端工程师岗位职责、技术要求和常见面试题

文章来源:https://blog.csdn.net/eqmaster/article/details/141891186 GIS 前端工程师负责运用前端技术实现地理信息系统的可视化交互界面,以提升用户对地理数据的操作体验和分析能力。 GIS 后端工程师岗位职责 界面开发 负责 GIS 应用的前端界面设计…

打造智能洗衣店:Spring Boot订单管理系统

1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…

Ubuntu安装nvidia显卡驱动

一、安装依赖 1、更新 sudo apt update sudo apt upgrade -y 2、基础工具 sudo apt install -y build-essential cmake 图形界面相关 sudo apt install -y lightdm 注:在弹出对话框选择"lightdm" 下载nvidia驱动: 进入如下网址:http…

机器人末端的负载辨识

关节处的摩擦力变小了,导致系统的参数辨识精度会变高,因为动力学方程中的摩擦力项占的比例会变小。 为什么要有一个负载的参数辨识,因为对于整个系统来说,除了负载哈,其他关节都是不变的,出厂时都设置好了&…

Java基础-知识点

文章目录 数据类型包装类型缓存池 String概述不可变的含义不可变的好处String、StringBuffer、StringBuilderString.intern() 运算参数传递float与double隐式类型转换switch 继承访问权限抽象类与接口super重写与重载**1. 重写(Override)****2. 重载(Overload)** Object类的通用…

FFMPEG数据封装格式、多媒体传输协议、音视频编解码器

FFMPEG堪称自由软件中最完备的一套多媒体支持库,它几乎实现了所有当下常见的数据封装格式、多媒体传输协议以及音视频编解码器,提供了录制、转换以及流化音视频的完整解决方案。 ffmpeg命令行参数解释 ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出…

速通!腾讯发布《2024大模型十大趋势》

【写在前面】 腾讯发布的《2024大模型十大趋势》报告在2024世界人工智能大会上引起了广泛关注。该报告深入分析了人工智能领域的最新进展,特别是大模型技术在不同应用场景中的潜力和影响,并预测了未来人工智能的发展方向。 “大模型技术发展方向 大模型…

深入理解HTTP Cookie

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 HTTP Cookie定义工作原理分类安全性用途 认识 cookie基本格式实验测试 cookie 当我们登录了B站过后,为什么下次访问B站就…

光伏电站灰尘监测系统的工作原理

型号:TH-HS1】光伏电站灰尘监测系统是一种专门用于监测光伏电站内部灰尘积累情况的系统,通过安装在太阳能电池板表面的传感器,实时收集电池板表面的灰尘信息,包括灰尘厚度、污染比、洁净比等,并将这些数据发送到中央处…

杨中科 ASP.NETCORE 异步编程二

一、不要用sleep() 如果想在异步方法中暂停一段时间,不要用Thread.sleep(),因为它会阻塞调用线程,而要用await.Task.Delay()。 举例: 下载一个网址,3秒后下载另一个 示例: sleep() 为了能直观看到效果,使用winfor…

【STM32开发之寄存器版】(八)-定时器的编码器接口模式

一、前言 1.1 编码器接口原理 编码器模式主要用于检测旋转编码器的转动方向和转动速度。旋转编码器一般输出两路相位相差90度的脉冲信号(称为A相和B相),通过这两路信号,定时器可以判断编码器的旋转方向,并计数转动的脉…

新同事半天搭建了一套CRM系统,实力赢得老板青睐直接转正

我们都知道,搭建一套CRM系统,根据功能和数据的复杂性,一般需要2至4周才能完成。最近,我们团队新来了一位同事,之前做过产品,没写过代码。老板安排他试试能不能搭建一套CRM系统,主要用于市场部同…

【学术会议征稿】第五届应用力学与机械工程国际学术会议(ICAMME 2024)

第五届应用力学与机械工程国际学术会议(ICAMME 2024) 2024 5th International Conference on Applied Mechanics and Mechanical Engineering 在全球技术快速发展的背景下,应用力学和机械工程作为推动现代工业创新的根基,持续展…

解决html2canvas图片模糊不清,超出一页长截图问题

前言 最近需要做一个页面截图功能,类似QQ、微信截图功能,核心是将Html网页转换成图片格式,并且尽可能保证截图后图片样式和原网页一致。对比了一些第三方插件以及浏览器自带的API,最终选择使用JavaScript库‌:如html2…

【读书笔记·VLSI电路设计方法解密】问题7:什么是基于标准单元的专用集成电路 (ASIC) 设计方法论

标准单元方法论是一种基于预组装库单元的芯片设计方法。该库中包含的标准单元和宏单元(例如存储器、I/O、特殊功能单元、锁相环(PLLs)等)已经在预定的工艺节点中设计、布局并经过验证。这些单元经过完全表征,并在逻辑、时序、物理和电气模型方面进行了定义,并正确地打包在…

【学术会议征稿】2024年智能通信、感知与电磁学术会议(ICSE 2024)

2024年智能通信、感知与电磁学术会议(ICSE 2024) 2024 International Conference on Intelligent Communication, Sensing and Electromagnetics 2024年智能通信、感知与电磁学术会议(ICSE 2024)将于2024年12月13-15日在中国-广…

【AI系统】AI在不同领域的应用与行业影响

本文将探讨AI在不同技术领域和行业中的广泛应用,以及这些应用如何影响和改变我们的世界。 I. 引言 AI技术正日益渗透到各个技术领域,从计算机视觉到自然语言处理,再到音频处理,AI的应用正变得越来越广泛。这些技术的发展不仅推动…

TMtech凯珏LED驱动芯片T8332AD升降压线性

T8332AD 是 TM Technology, Inc. 设计的一款多功能 LED 驱动 IC。它具有广泛的输入电压范围、精确的恒流控制和多种保护机制,非常适合各种大功率 LED 应用。以下是其主要特点、应用和技术规格的概述。 主要特点 1. 宽输入电压范围:在 5V 到 60V 之间高…