MySQL 索引和底层数据结构与算法

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

索引数据结构


二叉树


二叉树(binary tree)是指树中节点的度不大于 2 的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树


对于数组 {1,2,3,4,5} 数据结构将成为了链表


特点:


  • 父节点下面有两个子节点。


  • 右边节点的数据大于左边节点的数据。


image.png


红黑树


红黑树是一种特定类型的二叉树,它是在计算机科学中用来组织数据比如数字的块的一种结构。若一棵二叉查找树是红黑树,则它的任一子树必为红黑树。


红黑树是一种平衡二叉查找树的变体,它的左右子树高差有可能大于 1,所以红黑树不是严格意义上的平衡二叉树(AVL),但对之进行平衡的代价较低, 其平均统计性能要强于 AVL 。


由于每一棵红黑树都是一棵二叉排序树,因此,在对红黑树进行查找时,可以采用运用于普通二叉排序树上的查找算法,在查找过程中不需要颜色信息。


红黑树数据结构如下图:


image.png


特点:


  • 红黑树是每个结点都带有颜色属性的二叉查找树,颜色或红色或黑色。


  • 结点是红色或黑色。


  • 根结点是黑色。


  • 所有叶子都是黑色。(叶子是NIL结点)


  • 每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结点)


  • 从任一节结点其每个叶子的所有路径都包含相同数目的黑色结点。


  • 这些约束强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。


  • 是性质4导致路径上不能有两个连续的红色结点确保了这个结果。最短的可能路径都是黑色结点,最长的可能路径有交替的红色和黑色结点。因为根据性质5所有最长的路径都有相同数目的黑色结点,这就表明了没有路径能多于任何其他路径的两倍长。


  • 因为红黑树是一种特化的二叉查找树,所以红黑树上的只读操作与普通二叉查找树相同。


B-Tree


  • 叶子结点具有相同的深度,叶节点的指针为空


  • 所有元素不重复


  • 节点中的数据索引从左到右边递增排列



image.png


B+Tree


  • 非叶子结点不存储数据,只存储索引(冗余),可以存放更多的索引


  • 叶子结点包含所有索引字段


  • 叶子结点用指针链接,提高区间访问的性能(可以提升范围查找的效率)



image.png


特点关键字:节点内有序,叶子结点指针链接,非叶子结点存储索引(冗余)


查询mysql 索引的数据页的大小:


mysql> show global status like 'Innodb_page_size';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| Innodb_page_size | 16384 |
+------------------+-------+


为什么设置 16kb 呢?


Hash


  • 对索引的 key 进行一次 hash 计算就可以定位出数据存储的位置


  • 很多的时候 hash 索引要比 B+ 树索引更高效


  • 仅能满足 “=” , “in”  不支持范围查询


  • 存在 hash 冲突问题


image.png


索引


InnoDB 索引实现(聚集)


  • 表数据文件本省就是按 B+Tree 组织的一个索引结构文件


  • 聚集索引-叶子节点包含了完整的数据记录


  • 为什么 InnoDb 表必须有主键,并且推荐使用整型的自增主键?


  • 如果没有设置索引的话,MySQL 会选择一个数据唯一的列作为主键索引, 如果找不这样的列。会去做创建一个隐藏列类似  rowid


  • 表数据文件按照 B+Tree 的数据结构维护,在叶子节点维护的是该行的数据。所以必须有主键。


  • 整型更方便 B+Tree 排序,自增的话,对于数据结构的存放更快,  顺序存放,不需要进行大量树的平衡操作


  • 为什么非主键索引结构叶子节点的存储的是主键值?


  • 一致性, 让主键索引先成功,然后再去更新非主键索引关系


  • 节省存储空间。


  • 主键索引示意图:


image.png


  • 非主键索引示意图


image.png


如果查询的是通过 name = Alice 去查询的时候:


  1. 走非主键索引去查询,查询完后拿到信息(Alice, 18)。其实这里也是一个非聚簇索引


  1. 然后进行回表查询,再次通过主键去查询做回表查询。


两个数据文件


.frm 主要是存储表结构信息


.ibd 主要是存储索引和数据


MyISAM 索引文件(非聚集)


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


image.png


三个数据文件:


.frm 数据结构文件


.myd 文件主要是存储数据


.myi 文件主要是存储索引信息


聚集索引和非聚集索引


特征:


聚集/非聚集主要是索引文件是否和数据文件在一起。


查询效率上来说聚集索引不会跨文件查询效率会更加快。


联合/复合索引


多个字段组织成一个共同的索引


image.png


  • 最左前缀原理为什么这样来使用?


  1. 索引的数据是被排序的,如果跳过字段的话是无法被使用的。


       b. 示例:


where name = 'Jeff' and age = 22              -- 命中索引

where age = 30  and postatin='manager'        -- 不命中索引

where postation = 'dev'                       -- 不命中索引


参考资料



相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
344 66
|
2月前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
410 9
|
12天前
|
缓存 算法 关系型数据库
MySQL底层概述—8.JOIN排序索引优化
本文主要介绍了MySQL中几种关键的优化技术和概念,包括Join算法原理、IN和EXISTS函数的使用场景、索引排序与额外排序(Using filesort)的区别及优化方法、以及单表和多表查询的索引优化策略。
MySQL底层概述—8.JOIN排序索引优化
|
1月前
|
存储 关系型数据库 MySQL
MySQL索引学习笔记
本文深入探讨了MySQL数据库中慢查询分析的关键概念和技术手段。
217 68
|
16天前
|
SQL 存储 关系型数据库
MySQL原理简介—9.MySQL索引原理
本文详细介绍了MySQL索引的设计与使用原则,涵盖磁盘数据页的存储结构、页分裂机制、主键索引设计及查询过程、聚簇索引和二级索引的原理、B+树索引的维护、联合索引的使用规则、SQL排序和分组时如何利用索引、回表查询对性能的影响以及索引覆盖的概念。此外还讨论了索引设计的案例,包括如何处理where筛选和order by排序之间的冲突、低基数字段的处理方式、范围查询字段的位置安排,以及通过辅助索引来优化特定查询场景。总结了设计索引的原则,如尽量包含where、order by、group by中的字段,选择离散度高的字段作为索引,限制索引数量,并针对频繁查询的低基数字段进行特殊处理等。
MySQL原理简介—9.MySQL索引原理
|
14天前
|
存储 关系型数据库 MySQL
MySQL底层概述—6.索引原理
本文详细回顾了:索引原理、二叉查找树、平衡二叉树(AVL树)、红黑树、B-Tree、B+Tree、Hash索引、聚簇索引与非聚簇索引。
MySQL底层概述—6.索引原理
|
4月前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
1月前
|
SQL 存储 关系型数据库
MySQL秘籍之索引与查询优化实战指南
最左前缀原则。不冗余原则。最大选择性原则。所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!
120 22
 MySQL秘籍之索引与查询优化实战指南
|
1月前
|
存储 关系型数据库 MySQL
浅入浅出——MySQL索引
本文介绍了数据库索引的概念和各种索引结构,如哈希表、B+树、InnoDB引擎的索引运作原理等。还分享了覆盖索引、联合索引、最左前缀原则等优化技巧,以及如何避免索引误用,提高数据库性能。
|
1月前
|
存储 关系型数据库 MySQL
MySQL中为什么要使用索引合并(Index Merge)?
通过这些内容的详细介绍和实际案例分析,希望能帮助您深入理解索引合并及其在MySQL中的
155 10