MySql进阶索引篇01——深度讲解索引的数据结构:B+树(二)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 深度讲解索引的数据结构:B+树

缺点有:


插入性能依赖于插入顺序,如果我们按照主键进行升序插入,那么插入数据的效率肯定是最高的,否则可能会出现页分裂,严重影响性能。因此,对于InnoDB引擎,我们一般会定义一个自增的列为主键。

更新主键的代价很高。更新主键将导致被更新的行移动,我们一般定义,在InnoDB引擎中,主键不可更新。

二级索引(后面介绍)要经过两次索引查找,一次找到主键值,第二次根据主键值找到行数据。


聚簇索引有以下几点需要注意:


对于Mysql数据库,MyISAM搜索引擎一般没有聚簇索引,InnoDB支持聚簇索引。

由于数据的物理存储方式只能有一种,一个表只能有一个聚簇索引,一般就是使用主键;如果没有指定主键,InnoDB会自动选择一个非空唯一索引构建聚簇索引;如果没有合适的字段,InnoDB会隐式的创建主键构建聚簇索引。

3.2 二级索引

二级索引又称为非聚簇索引,辅助索引。一个表中只允许有一个聚簇索引,但是允许有多个二级索引。如果我们需要依赖非主键进行查找,就需要二级索引了。


如下图,二级索引的叶子节点并不会存储完整的数据,只是存储了建立索引的列的值与主键值。

我们如果需要进行如下查找:

select * form index_demo where c2 = 4

需要先在二级索引中查找到对应的数据项,也就是主键为1,4,10的记录,再到聚簇索引中去查找对应主键值的数据,这个过程我们称之为回表

对于聚簇索引,数据的查询效率更高(不用回表)。但是对于非聚簇索引,更新数据的效率更高,比如我们更新一个记录的c3列的值,对应的聚簇索引的值也需要进行更新,但是c2的二级索引并没有存储c3的数据,因此不用更新。

3.3 联合索引

严格来说,联合索引属于非聚簇索引。设想如下场景。

(1)对于数据基于c2排序

(2)如果c2数据相同则基于c3排序

这种场景就可以建立联合索引。

3.4.InnoDB的B+树注意事项
3.4.1 根页面位置万年不动

前面我们在介绍时,为了方便大家的理解,先把叶子节点构建了出来,然后往上增加层次。实际上,B+树的形成过程是这样的。


当我们创建一个新的索引时(或者主键自动生成新的索引时),初始时将会创建一个节点作为根节点,此时根节点中没有用户记录,也没有数据项记录。

当插入记录时,记录会被插入到根节点。

当根节点的记录满了,会分配一个新的数据页,比如数据页A,将根节点的数据全部拷贝到数据页A中,然后数据页进行页分裂操作得到页B,此时插入数据时再根据键值大小(主键值大小或者索引列值大小)决定插入到数据页B中还是数据页A中。

根节点会晋升为目录页。

根节点万年不动的原则保证InnoDB数据需要使用某个索引时可以在固定位置取出根节点的页号,从而来访问这个索引。


3.4.2 内节点中目录项记录具有唯一性

我们知道B+树的目录页中存储的记录为页号+索引列数据,这样的描述其实并不严谨。


假设index_demo表中的数据如下表。

此时建立的二级索引B+树如下图。

如果我们需要增加一个记录(9,1,‘c’),我们是应该把这个记录添加到页4还是页5呢?

因此我们必须要求内节点(非叶子节点)的记录(除页号)是唯一的。如何能够实现呢?我们可以自然联想到主键是唯一的。因此下图才是我们实际上真正构建的二级索引的B+树。

此时添加记录(9,1,‘c’)就不迷惑了。我们先判断c2一样,再判断主键值,可以确定应该在页5中添加数据。

3.4.3 一个页面最少要存储两条记录

如果一个页面的记录数少于两条,甚至都无法分为二叉树,只是简单的单向连接。

4.MyISam的索引方案

4.1 不同存储引擎索引的区别

B+树适用的存储引擎如下所示。注:MySql官方中写的B-Tree就是我们所理解的B+树。

InnoDBheMyISAM默认索引都是B-Tree,不过MyISAM中叶子节点data域中存放的是数据记录的地址。而Memory支持的默认索引是Hash索引。

4.2 MyISam索引的原理

下面我们将介绍MyISam的索引原理。MyISam使用myd文件存储数据,用myi文件存储索引,MyISam的存储原理与InnoDB的聚簇索引的存储原理显然不同(索引即数据,数据即索引)。实际上,MyISam中根本不存在聚集索引的概念,它的索引都相当于二级索引。


其索引存储示例如下。

上图的col1是主键,一般我们都是按照主键递增来增加数据的 ,但如果我们增加一条主键为3的数据,还需要进行重新排序吗?答案是否,它会被直接添加到表格后,不进行排序。

实际上如果针对col2建立索引,与基于主键构建索引在结构上并没有什么不同。4.3 MyISam与InnoDB索引方案的对比

MyISam的索引不存储记录的数据值(或主键值),只存储数据地址,一定需要进行回表操作。

InnoDB的数据文件与索引文件是同一个,MyISam的数据文件与索引文件是分离的。

MyISam回表操作十分快速,因为是拿着地址的偏移量直接到文件中取数据。

InnoDB必须要有主键(如果没有会隐式指定),MyISam没有聚簇索引与二级索引的说法,不需要在二级索引中查找到主键值后再去聚簇索引中查询回表,因此并不是必须需要有主键。当然,我们为了查询方便,也会对该存储引擎的表设置索引。

4.4 索引方案与索引优化的关系

了解不同存储引擎的存储方案有利于我们进行索引优化。


例1:


InnoDB搜索引擎的主键值就不宜设置的过长,因为在所有二级索引中都需要对主键值进行存储。


例2:


用非单调(递增、减)字段在InnoDB存储引擎的表中做主键不合适。因为InnoDB的数据文件本身就是一棵B+树,会基于主键建立聚簇索引。导致我们在插入数据时频繁的发生页分裂。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
|
30天前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
21天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
105 1
|
1月前
|
存储 关系型数据库 MySQL
如何在MySQL中进行索引的创建和管理?
【10月更文挑战第16天】如何在MySQL中进行索引的创建和管理?
65 1
|
22天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
52 0
|
1月前
|
监控 关系型数据库 MySQL
mysql8索引优化
综上所述,深入理解和有效实施这些索引优化策略,是解锁MySQL 8.0数据库高性能查询的关键。
38 0
|
1月前
|
SQL 关系型数据库 MySQL
美团面试:mysql 索引失效?怎么解决? (重点知识,建议收藏,读10遍+)
本文详细解析了MySQL索引失效的多种场景及解决方法,包括破坏最左匹配原则、索引覆盖原则、前缀匹配原则、`ORDER BY`排序不当、`OR`关键字使用不当、索引列上有计算或函数、使用`NOT IN`和`NOT EXISTS`不当、列的比对等。通过实例演示和`EXPLAIN`命令分析,帮助读者深入理解索引失效的原因,并提供相应的优化建议。文章还推荐了《尼恩Java面试宝典》等资源,助力面试者提升技术水平,顺利通过面试。
|
13天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
26 1
|
15天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
29 4
|
1月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
63 3
Mysql(4)—数据库索引
下一篇
无影云桌面