十四、深入理解Mysql索引底层数据结构与算法

news2024/11/25 7:07:39

文章目录

  • 一、索引的本质
    • 1、索引是帮助MySQL高效获取数据的排好序的数据结构
    • 2、索引的数据结构
    • 3、数据结构可视化网站
  • 二、常见数据结构介绍
    • 1、B-Tree
    • 2、B+Tree(B-Tree变种)
    • 3、Hash结构
  • 三、存储引擎的索引实现
    • 1、MyISAM存储引擎索引实现
      • MyISAM索引文件和数据文件是分离的(非聚集)。
    • 2、InnoDB存储引擎索引实现
      • InnoDB索引实现(聚集):
  • 四、联合索引
    • 1、联合索引案例使用的脚本
    • 2、索引最左前缀原理
    • 3、关于最左前缀的补充
      • 索引跳跃扫描(Index Skip Scan)
      • 索引跳跃扫描优化原理
      • 生效的限制条件

一、索引的本质

1、索引是帮助MySQL高效获取数据的排好序的数据结构

在这里插入图片描述

2、索引的数据结构

  • 二叉树
  • B-Tree
  • Hash表
  • 红黑树

3、数据结构可视化网站

为了更好的了解数据结构,直观的感受数据结构的变化,可以使用如下网站,进行可视化操作。
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

二、常见数据结构介绍

1、B-Tree

  • 叶节点具有相同的深度,叶节点的指针为空。
  • 所有索引元素不重复。
  • 节点中的数据索引从左到右递增排列。
    在这里插入图片描述

2、B+Tree(B-Tree变种)

  • 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引。
  • 叶子节点包含所有索引字段。
  • 叶子节点用指针连接,提高区间访问的性能。
    在这里插入图片描述

3、Hash结构

  • 对索引的key进行一次hash计算就可以定位出数据存储的位置。
  • 很多时候Hash索引要比B+ 树索引更高效。
  • 仅能满足 “=”,“IN”,不支持范围查询。
  • hash冲突问题。
    在这里插入图片描述

三、存储引擎的索引实现

1、MyISAM存储引擎索引实现

MyISAM索引文件和数据文件是分离的(非聚集)。

在这里插入图片描述

2、InnoDB存储引擎索引实现

InnoDB索引实现(聚集):

  • 表数据文件本身就是按B+Tree组织的一个索引结构文件
  • 聚集索引-叶节点包含了完整的数据记录
  • 为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?(方便排序提升查找效率)
  • 为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)

四、联合索引

1、联合索引案例使用的脚本

CREATE TABLE `employees` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名',
  `age` int(11) NOT NULL DEFAULT '0' COMMENT '年龄',
  `position` varchar(20) NOT NULL DEFAULT '' COMMENT '职位',
  `hire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入职时间',
  PRIMARY KEY (`id`),
  KEY `idx_name_age_position` (`name`,`age`,`position`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='员工记录表';

INSERT INTO employees(name,age,position,hire_time) VALUES('LiLei',22,'manager',NOW());
INSERT INTO employees(name,age,position,hire_time) VALUES('HanMeimei', 23,'dev',NOW());
INSERT INTO employees(name,age,position,hire_time) VALUES('Lucy',23,'dev',NOW());

EXPLAIN SELECT * FROM employees WHERE name = 'Bill' and age = 31;
EXPLAIN SELECT * FROM employees WHERE age = 30 AND position = 'dev';
EXPLAIN SELECT * FROM employees WHERE position = 'manager';

2、索引最左前缀原理

在联合索引中,索引的数据结构如下,正常的索引是遵循B+树结构,索引项从左到右,从小到大排序,假设我们跳过name,直接使用联合索引中的ageposition,由于在比较中,无法先确认第一项name,故无法对整个索引项进行排序,从而导致联合索引失效。
简单理解,其实索引的最左前缀原理就是根据索引中开始的索引字段,按顺序进行匹配排序,实现通过索引的高效查找的的一种规则。
在这里插入图片描述

3、关于最左前缀的补充

索引跳跃扫描(Index Skip Scan)

MySQL一定是遵循最左前缀匹配的,这句话在mysql8以前是正确的,没有任何毛病。但是在MySQL 8.0中,就不一定了。

参考:https://dev.mysql.com/doc/refman/8.0/en/range-optimization.html#range-access-skip-scan

官网示例

CREATE TABLE t1 (f1 INT NOT NULL, f2 INT NOT NULL, PRIMARY KEY(f1, f2));
INSERT INTO t1 VALUES
(1,1), (1,2), (1,3), (1,4), (1,5),
(2,1), (2,2), (2,3), (2,4), (2,5);
INSERT INTO t1 SELECT f1, f2 + 5 FROM t1;
INSERT INTO t1 SELECT f1, f2 + 10 FROM t1;
INSERT INTO t1 SELECT f1, f2 + 20 FROM t1;
INSERT INTO t1 SELECT f1, f2 + 40 FROM t1;
ANALYZE TABLE t1;

EXPLAIN SELECT f1, f2 FROM t1 WHERE f2 > 40;

在这里插入图片描述
虽然我们的SQL中,没有遵循最左前缀原则,只使用了f2作为查询条件,但是经过MySQL 8.0的优化以后,还是通过索引跳跃扫描的方式用到了索引了。

索引跳跃扫描优化原理

mysql8.013后通过优化器帮我们加了联合索引,SQL执行过程如下:

  1. 获取 f1 字段第一个唯一值,也就是 f1 = 1
  2. 构造 f1 = 1 and f2 > 40,进行范围查询
  3. 获取 f1字段第二个唯一值,也就是 f1 = 2
  4. 构造 f1 = 2 and f2 > 40,进行范围查询
SELECT f1, f2 FROM t1 WHERE f2 > 40;

-- 执行的最终SQL:
SELECT f1, f2 FROM t1 WHERE f1 =1 and f2 > 40
UNION
SELECT f1, f2 FROM t1 WHERE f1 =2 and f2 > 40;

所以对于f1值很少,区分度不高的情况索引跳跃扫描会快一些;反之查询效率慢些。
我们不能依赖这个优化,建立索引的时候,还是优先把区分度高的,查询频繁的字段放到联合索引的左边。

生效的限制条件

  • 查询必须只能依赖一张表,不能多表JOIN。
  • 查询中不能使用 GROUP BY 或 DISTINCT 语句。
  • 查询的字段必须是索引中的列。
  • 组合索引形式:([A_1, …, A_k,] B_1, …, B_m, C [, D_1, …, D_n]),A,D 可以为空,但是B ,C 不能为空。

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

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

相关文章

数理统计(第1章第2节:一些常用的抽样分布)

目录 统计量的概率分布称为“抽样分布” 1. 正态母体的子样平均数的抽样分布 正态分布 2. 卡方分布 3. t分布 4. F分布 5. 例题 6. 总结 统计量的概率分布称为“抽样分布” 1. 正态母体的子样平均数的抽样分布 正态分布 若随机变量X的概率密度为: 则称X服…

[C#]winform部署官方yolov11-obb旋转框检测的onnx模型

【官方框架地址】 https://github.com/ultralytics/ultralytics 【算法介绍】 Yolov11-obb(You Only Look Once version 8 with Oriented Bounding Boxes)是一种先进的对象检测算法,它在传统的Yolov3和Yolov4基础上进行了优化,加…

Python 如何使用 scikit-learn 进行模型训练

如何使用 scikit-learn 进行模型训练 一、简介 在现代的数据科学和机器学习领域,Python 已经成为最流行的编程语言之一。而其中最流行的机器学习库之一就是 scikit-learn。scikit-learn 提供了许多方便的工具和函数来实现常见的机器学习任务,包括数据预…

spi hal库 正点原子版

这个图 是了解一下 spi就是cs片选,clk时钟,miso主机输入从机输出,mosi主机输出从机输入,这四根线 spi最主要就是极性和相位的选择,spi是边沿采集,和iic的电平采集不一样,所以需要通过极性和相位…

SpringBoot 多元化配置(正则表达式,配置文件优先级)

1.配置绑定 所谓“配置绑定”就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常,我们会把一些配置信息(例如,数据库配置)放在配置文件中,然后通过 Java 代码去读取该配置文件,并且把配置文件中…

【持续更新中】MMDetection3训练自己的数据集常见报错解决

博主近来跑自己数据集需要对比试验,故选择了MMDetection3这一算法整合详细的框架,遇到了较多问题在此处留作记录,若你也有相应的问题可以在评论区提出与解决方法。会持续更新,同时欢迎批评指正。 0.ModuleNotFoundError: No modu…

从博士到院士,国家级人才荣誉称号一览

在中国的科技界,两院院士代表着学术成就的巅峰荣誉,享有终身荣耀,并且是科研人员梦寐以求的最高职业荣誉。除了院士头衔之外,国家和各部委还设立了一系列针对不同年龄段学术人才的国家级荣誉称号体系,旨在表彰各类优秀…

8.9K Star,开源自托管离线翻译引擎

Hi,骚年,我是大 G,公众号「GitHub 指北」会推荐 GitHub 上有趣有用的项目,一分钟 get 一个优秀的开源项目,挖掘开源的价值,欢迎关注。 在全球化的今天,跨语言交流已成为日常需求,然…

U3D游戏开发之中剧情系统的制作

今天我们来揭秘带有人物选项的剧情系统该如何制作。 半年前我接到了一个剧情系统的需求,本着能抄代码绝不自己动手的想法在B站上面找现成系统,大概看了一些内容,发现比较繁琐就直接自己动手写了。 目录 1 需求分析 2 梳理代码逻辑 3 代码书…

k8s 中存储之 NFS 卷

目录 1 NFS 卷的介绍 2 NFS 卷的实践操作 2.1 部署一台 NFS 共享主机 2.2 在所有k8s节点中安装nfs-utils 2.3 部署nfs卷 2.3.1 生成 pod 清单文件 2.3.2 修改 pod 清单文件增加 实现 NFS卷 挂载的 参数 2.3.3 声明签单文件并查看是否创建成功 2.3.4 在 NFS 服务器 创建默认发布…

[c语言]一句话讲清循环中break和continue的作用与区别

1.两者的作用 break和contuinue都只能在循环中使用,都用来停止循环。 2.两者的区别 break 在循环中只要遇到break,就直接永久终止当前循环,开始执行当前循环之外的代码。 continue 在循环中只要遇到continue,就结束本次循环&…

免费送源码:Java+ssm+JSP+Ajax SSM棕榈校园论坛的开发 计算机毕业设计原创定制

摘要 随着计算机科学技术的高速发展,计算机成了人们日常生活的必需品,从而也带动了一系列与此相关产业,是人们的生活发生了翻天覆地的变化,而网络化的出现也在改变着人们传统的生活方式,包括工作,学习,社交…

数据库软题6.1-关系模式-关系模式的各种键

关系模式的各种键 题1-由关系模式求候选键 1. 候选键唯一不冗余 对选项进行闭包运算,如果得到全部属性U,则为候选码 A:AC-ABC-ABCD B:AB-ABC-ABCD C:AE-ABE-ABCE -ABCDE-ABCDEH D:DE2. R的候选码可以从A1,A2,A3,A1A2,A1A3,A2A3,A1A2A3中选择&#xff…

Flutter String 按 ,。分割

在 Flutter 中,如果你想将一个字符串按特定的字符(例如中文逗号 , 和英文句号 .)进行分割,可以使用 Dart 语言的字符串处理功能。具体来说,你可以使用 split 方法,并传入一个正则表达式来匹配这…

CSS基础-常见属性(二)

6、CSS三大特性 6.1 层叠性 如果样式发生冲突,则按照优先级进行覆盖。 6.2 继承性 元素自动继承其父元素、祖先元素所设置的某些元素,优先继承较近的元素。 6.3 优先级 6.3.1 简单分级 1、内联样式2、ID选择器3、类选择器/属性选择器4、标签名选择器/…

数据结构之树(1)

课程:b站王道数据结构 5.1.1 树的定义和基本术语_哔哩哔哩_bilibili 写在前面:基础不牢,地动山摇。。 一、树 1、概念 树是n(n>0)个结点的有限集合,n0时,称为空树 非空树的特性 有且仅有一个根节点…

智能家居有哪些产品?生活中常见的人工智能有哪些?

智能家居有哪些产品? 1、智能照明设备类:智能开关、智能插座、灯控模块、智能空开、智能灯、无线开关。 2、家庭安防类:智能门锁、智能摄像机、智能猫眼、智能门铃。 3、智能传感器类:烟雾传感器、可燃气体传感器、水浸传感器、声光报警器…

CentOS7系统配置Yum环境

新安装完系统的服务器往往缺少我们常用的依赖包,故需要设置好yum源,方便软件安装,以下是CentOS7为例,系统安装后yum默认安装。 //备份之前的配置文件 mv /etc/yum.repos.d /etc/yum.repos.d.bak mkdir -p /etc/yum.repos.d 1…

鸿蒙开发之ArkUI 界面篇 十八 京东app登录界面实现

鸿蒙UI实现某东App登录界面,如下图鲜果,我们先分析整体架构是什么! 我们整体架构分析,分为区域1、2、3、4、5、6、7、8、9区域,下图: 8个区域的整体方向是垂直的,容器使用的是Column,区域1使用的是子容器Row,左边是Image,右边是Text,区域2是Image,区域3第一感觉是…

欧姆龙(Omron)协议解析

1. 协议概述    欧姆龙(Omron)是来自日本的知名电子和自控设备制造商,其中、小型PLC在国内市场有较高的占有率,有CJ、CM等系列。PLC可以支持Fins、Host link等协议进行通信。 支持以太网的欧姆龙PLC CPU、以太网通信模块根据型号的不同,一般…