【数据库】- mysql - 索引

本文详细介绍了MySQL中的索引,包括索引的作用、优点,常见索引结构如Hash、二叉树、B树和B+Tree的优缺点,以及InnoDB和MyISAM存储引擎下的B+Tree结构。还讨论了索引分类,如按数据结构、物理存储、字段特性和字段个数分类,并提到了主键、唯一索引、普通索引、全文索引和组合索引的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

索引

常用索引结构

 InnoDB&MyISAM下的B+Tree

索引分类


version:mysql 8.0


索引

        是帮助数据库高效获取数据,排好顺序的数据结构

索引的优点:

1、大大减少了服务器需要扫描的数据量

2、帮助服务器避免排序和临时表

3、将随机io变成顺序io

索引的作用:

1、快速查找匹配WHERE子句的行

2、从consideration中消除行,如果可以在多个索引之间进行选择,mysql通常会使用找到最少行的索引

3、如果表具有多列索引,则优化器可以使用索引的任何最左前缀来查找行

4、当有表连接的时候,从其他表检索行数据

5、查找特定索引列的min或max值

6、如果排序或分组时在可用索引的最左前缀上完成的,则对表进行排序和分组

7、在某些情况下,可以优化查询以检索值而无需查询数据行

常用索引结构

        hash结构索引格式

 缺点:

1、利用hash存储的话需要将所有的数据文件添加到内存,比较耗费内存空间

2、当存在hash 冲突时,hash索引没办法进行范围查找

3、如果所有的查询都是等值查询,那么hash确实很快,但是在企业或者实际工作环境中范围查找的数据更多,而不是等值查询,因此hash就不太适合了

:InnoDB实际上也支持Hash索引,但是InnoDB中Hash索引属于是自适应Hash索引,它的创建过程由存储引擎引擎自动优化创建,不能人为干预是否为表创建Hash索引

        二叉树结构索引格式

        

        红黑树结构索引格式

       

 缺点:

无论是二叉树(或平衡二叉树)还是红黑树,都会因为树的深度过深而造成io次数变多,数据量越大树的深度越多,影响数据读取的效率。

        B树索引格式

 B树特点:

1、所有键值分布在整颗树中

2、搜索有可能在非叶子结点结束,在关键字全集内做一次查找,性能逼近二分查找

3、每个节点最多拥有m个子树

4、根节点至少有2个子树

5、分支节点至少拥有m/2颗子树(除根节点和叶子节点外都是分支节点)

6、所有叶子节点都在同一层、每个节点最多可以有m-1个key,并且以升序排列

缺点:

1、每个节点都有key,同时也包含data(行数据信息),而每个页存储空间是有限的,如果data比较大的话会导致每个节点存储的key数量变小

2、当存储的数据量很大的时候会导致深度较大,增大查询时磁盘io次数,进而影响查询性能

        B+树索引格式        

        

 

B+Tree是在B Tree的基础之上做的一种优化,变化如下:

1、B+Tree每个节点可以包含更多的节点,这个做的原因有两个,第一个原因是为了降低树的高度,第二个原因是将数据范围变为多个区间,区间越多,数据检索越快

2、非叶子节点存储key,叶子节点存储key和数据

3、叶子节点两两指针相互连接(符合磁盘的预读特性),顺序查询性能更高

在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。因此可以对 B+Tree 进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。        

 InnoDB&MyISAM下的B+Tree

InnoDB存储引擎下的B+Tree存储结构

 注意:

1、InnoDB是通过B+Tree结构对主键创建索引,然后叶子节点中存储记录,如果没有主键,那么会选择唯一键,如果没有唯一键,那么会生成一个6位的row_id来作为主键

2、如果创建索引的键是其他字段,那么在叶子节点中存储的是该记录的主键,然后再通过主键索引找到对应的记录,叫做回表

MyISAM存储引擎下的B+Tree存储结构

索引分类

按数据结构分类:B+tree索引、Hash索引、Full-text索引。
按物理存储分类:聚集索引、非聚集索引(也叫二级索引、辅助索引)。
按字段特性分类:主键索引(PRIMARY KEY)、唯一索引(UNIQUE)、普通索引(INDEX)、全文索引(FULLTEXT)。
按字段个数分类:单列索引、联合索引(也叫复合索引、组合索引)。

普通索引(NORMAL):

        建立在普通字段上的索引被称为普通索引。
唯一索引(UNIQUE):

        建立在UNIQUE字段上的索引被称为唯一索引,一张表可以有多个唯一索引,索引列值允许为空,列值中出现多个空值不会发生重复冲突。
主键索引 (PRIMARY):

        建立在主键上的索引被称为主键索引,一张数据表只能有一个主键索引,索引列值不允许有空值,通常在创建表时一起创建。
组合索引

        即一个索引包含多个列。创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)
全文索引(FULLTEXT):

        MyISAM 存储引擎支持Full-text索引,用于查找文本中的关键词,而不是直接比较是否相等。Full-text索引一般使用倒排索引实现,它记录着关键词到其所在文档的映射

聚簇索引

        不是单独的索引类型,而是一种数据存储方式,指的是数据行跟相邻的键值紧凑的存储在一起
非聚簇索引

        数据文件跟索引文件分开存放,更具索引值回表查询整条数据


个人基于源码分析,学习总结分享,如有问题,请联系博主,蟹蟹!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

debug ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值