解读Mysql索引

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 分析mysql索引底层实现及阿里索引规范解读

一.索引的数据结构

索引是帮助数据库高效获取数据的一种排好序的数据结构。我们一般常用的数据结构有:
二叉树、红黑树、B-Tree、HashMap
先说下结论,mysql的索引不管存储引擎是innodb还是mylsam使用的都是B+Tree,为何使用B+Tree呢
主要是其它几种数据结构针对数据库这种场景都有一些“硬伤”。
先来看下二叉树的“硬伤”,这里推荐一个数据结构学习的网站,可以很形象的模拟各种常用的数据结构组织过程及查找过程,本文中使用的树的图都是使用该网站生成的。
数据结构学习网站:.
二叉树支持动态的插入和查找,保证操作在O(height)时间,这就是完成了哈希表不便完成的工作,动态性。
但是二叉树有可能出现worst-case,如果输入序列已经排序,则时间复杂度为O(N),出现O(N)的情况就是如下这种情况:
二叉树示例
为了解决二叉树出现worst-case的情况,将查找的时间复杂度尽量保证在O(logN)范围内,于是就有了红黑树。
红黑树属于一种平衡二叉树,查找的性能比较高,其基于最长路径长度不会超过最短路近的2倍进行整个树的平衡。
当数据量巨大时,因为每个节点最多只有两个子节点,所以会导致树比较高。
红黑树示例
那怎么解决大量数据时,树比较高的问题呢,如果每个节点的子节点可以大于2个呢,这样不就可以解决树的高度问题了,于是B树就应运而生了
B树
B+树
使用B-Tree后,由于每个节点可以有多个字节点,则树的高度必然会大幅降低。树的高度降低会带来什么好处呢?
最大的好处就是会降低查找数据时需要的磁盘IO次数,从而提高查找数据的速度。innodb中最小存储单元是页,每页即对应一个节点。页的大小默认为16K。查找某条记录时,会从根节点开始依然往下查找,每定位到一个节点,就会将该节点存储的所有数据都从磁盘加载到内存中去进行比较。而磁盘IO的速度跟内存的读写速度相差几个数量级,所以降低磁盘IO的次数,是可以大幅降低查询数据的耗时。
mysql没有使用B树而是使用B+树作为索引,主要的原因有以下几点:

  1. B+树的磁盘读写代价更低,B+树的非叶子节点并没有存放数据,因此其内部节点相对B树更小,这样一个节点就能存放更多的索引,这样每次读取一页数据所包含的需要查找的索引字段也就越多,相对IO读写次数就降低了。
  2. B+树的查询效率更加稳定,由于非叶子结点并不保存数据,而只是叶子结点中数据的冗余索引。所以任何数据的查找必须走一条从根结点到叶子结点的路。所有数据查询的路径长度相同,导致每一个数据的查询效率相当。
  3. B+树更便于遍历,由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。
  4. B+树更适合基于范围的查询,B树在提高了IO性能的同时并没有解决元素遍历效率低下的问题,B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低。

二.Innodb索引的实现

innodb每张表都会对应到磁盘上的两个文件(.frm和.ibd)
innodb数据文件
frm是表结构文件,ibd 是数据和索引文件。可以看出innodb的数据和索引是在同一个文件。表数据文件本身就是按B+Tree组织的一个索引结构文件。innodb的数据结构主要由两种索引结构组成,聚簇索引(主键索引)和稀疏索引(二级索引)。
聚簇索引
聚簇索引-叶节点包含了完整的数据记录。
稀疏索引
稀疏索引-叶子节点包含了该二级索引对应的主键id。

三. 阿里索引规约的解读

阿里巴巴开发手册专门用一个小节讲了索引规约,理解了前面讲解的索引结构,这些规约就比较好理解了。我们选几条来看一看。
阿里索引规约
解读:索引是按照字段从左到右每个字符的ASSIC码的大小排好序的,比如索引Alice和Alina,建索引时只需要取4位,就可以将它们排好序了,而没必要用全部字段建索引。
阿里索引规约
解读:索引是按照字段从左到右每个字符的ASSIC码的大小排好序的,like %KK和%KK% 都是没法走索引的。联合索引也是按照建立顺序,从左到右以第一个字段开始排序,比如联合索引a_b_c,像where b>? and c>? 这种,b_c是没法走索引的。
阿里索引规约
解读:普通索引的叶子节点之存放的索引对应的字段信息以及主键id,尽量使查找的内容都在该索引包含的字段内,就可以避免再次回表去聚簇索引里查找了。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10天前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
|
1月前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
1月前
|
存储 NoSQL 关系型数据库
为什么MySQL不使用红黑树做索引
本文详细探讨了MySQL索引机制,解释了为何添加索引能提升查询效率。索引如同数据库的“目录”,在数据量庞大时提高查询速度。文中介绍了常见索引数据结构:哈希表、有序数组和搜索树(包括二叉树、平衡二叉树、红黑树、B-树和B+树)。重点分析了B+树在MyISAM和InnoDB引擎中的应用,并讨论了聚簇索引、非聚簇索引、联合索引及最左前缀原则。最后,还介绍了LSM-Tree在高频写入场景下的优势。通过对比多种数据结构,帮助理解不同场景下的索引选择。
85 6
|
1月前
|
SQL 关系型数据库 MySQL
案例剖析:MySQL唯一索引并发插入导致死锁!
案例剖析:MySQL唯一索引并发插入导致死锁!
114 0
案例剖析:MySQL唯一索引并发插入导致死锁!
|
1月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
64 3
Mysql(4)—数据库索引
|
24天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
121 1
|
1月前
|
存储 关系型数据库 MySQL
如何在MySQL中进行索引的创建和管理?
【10月更文挑战第16天】如何在MySQL中进行索引的创建和管理?
68 1
|
24天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
54 0
|
1月前
|
监控 关系型数据库 MySQL
MySQL数据表索引命名规范
MySQL数据表索引命名规范
70 1
|
1月前
|
存储 SQL 关系型数据库
mysql中主键索引和联合索引的原理与区别
本文详细介绍了MySQL中的主键索引和联合索引原理及其区别。主键索引按主键值排序,叶节点仅存储数据区,而索引页则存储索引和指向数据域的指针。联合索引由多个字段组成,遵循最左前缀原则,可提高查询效率。文章还探讨了索引扫描原理、索引失效情况及设计原则,并对比了InnoDB与MyISAM存储引擎中聚簇索引和非聚簇索引的特点。对于优化MySQL性能具有参考价值。

热门文章

最新文章

下一篇
无影云桌面