MySQL中索引类型的实现原理是什么

64次阅读
没有评论

共计 1956 个字符,预计需要花费 5 分钟才能阅读完成。

本篇文章给大家分享的是有关 MySQL 中索引类型的实现原理是什么,丸趣 TV 小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着丸趣 TV 小编一起来看看吧。

一、按表列属性分类:

1. 单列索引

以表的单个列字段创建的索引

2. 联合索引

以表的多个列字段组合创建的索引,在查询条件使用索引的从左字段顺序才会生效,遵循最左匹配原则。

单列索引和联合索引又包括:

普通索引

非主键,非唯一列的索引

主键索引

基于该表主键自动生成成的索引,如果未给表定义主键,会查找该表中是否存在非空、整形、唯一索引作为其主键 (可通过 select _rowid from
表名查看 ),若都不满足会隐式生成一个 rowid 作为主键 (无法直接查到)

唯一索引

基于表的唯一列生成的索引,允许为空值

全文索引

将存储于数据库中的整本书或整篇文章中任意内容信息查找出来,如大量级的文字中如 like % 关键字 %,普通索引的效率与全文索引相比是非常低的。

二、按数据结构分类:

1.B+tree 索引

b+tree 基于平衡二叉树的一种多路平衡查找树,所有记录都按照顺序存放在叶子节点中,各个叶子节点直接通过链表相连。与 b 树不同的是:

非叶子节点只存储键值信息。

所有叶子节点之间都有一个链指针。

数据记录都存放在叶子节点中。

2.hash 索引

基于 hash 表结构实现的索引,mysql 中只有 MEMORY/HEAP 和 NDB 存储引擎支持;

InnoDB 引擎支持自适应 hash 索引,但是是数据库自身创建使用的,而不能进行人为定义。当二级索引被频繁的访问时,便会自动创建自适应哈希索引;

通过 命令 SHOW ENGINE INNODB STATUS 可查看自适应 hash 索引的使用情况;

通过 命令 SHOW VARIABLES LIKE %ap%hash_index 查看是否打开自适应 hash 索引。

对比:

由于 hash 索引是比较其 hash 值,hash 索引只能进行等值查找而不能进行范围查找

hash 索引无法进行排序:原因同上

不支持最左匹配原则,复合索引时合并一起计算 hash 值

hash 索引的检索效率很高可以一次定位,但是当发生大量 hash 碰撞的时候,链表变长,hash 索引效率上是不如 b +tree 的

由于存在 hash 碰撞的问题,当需要获得总数时候,hash 索引在任何时候都不能避免表扫描

3.T-tree 索引无锡人流医院哪家好 http://www.wxbhnkyy120.com/

4.R-tree 索引

三、按存储结构分类:

1. 聚簇索引 (聚集索引)

InnoDB 的聚簇索引实际上是在同一个 BTree 结构中同时存储了索引和整行数据,通过该索引查询可以直接获取查询数据行。

聚簇索引不是一种单独的索引类型,而是一种数据的存储方式,聚簇索引的顺序,就是数据在硬盘上的物理顺序。

在 mysql 通常聚簇索引是主键的同义词,每张表只包含一个聚簇索引 (其他数据库不一定)。

2. 辅助索引 (非聚集索引,次级索引,二级索引)

非聚集索引在 BTree 的叶子节点中保存了索引列和主键。如果查询列不在该索引内,只能查到其主键值,还需要回表操作查询聚簇索引进行查询。

聚簇索引的优点:

可以把相关数据保存在一起,如:实现电子邮箱时,可以根据用户 ID 来聚集数据,这样只需要从磁盘读取少量的数据页就能获取某个用户全部邮件,如果没有使用聚集索引,则每封邮件都可能导致一次磁盘 IO

数据访问更快,聚集索引将索引和数据保存在同一个 btree 中,因此从聚集索引中获取数据通常比在非聚集索引中查找要快

使用覆盖索引扫描的查询可以直接使用页节点中的主键值

聚簇索引的缺点:

聚簇数据最大限度地提高了 IO 密集型应用的性能,但如果数据全部放在内存中,则访问的顺序就没有那么重要了,聚集索引也没有什么优势了

插入速度严重依赖于插入顺序,按照主键的顺序插入是加载数据到 innodb 表中速度最快的方式,但如果不是按照主键顺序加载数据,那么在加载完成后最好使用 optimize
table 命令重新组织一下表

更新聚集索引列的代价很高,因为会强制 innodb 将每个被更新的行移动到新的位置

基于聚集索引的表在插入新行,或者主键被更新导致需要移动行的时候,可能面临页分裂的问题,当行的主键值要求必须将这一行插入到某个已满的页中时,存储引擎会将该页分裂成两个页面来容纳该行,这就是一次页分裂操作,页分裂会导致表占用更多的磁盘空间

聚集索引可能导致全表扫描变慢,尤其是行比较稀疏,或者由于页分裂导致数据存储不连续的时候

二级索引可能比想象的更大,因为在二级索引的叶子节点包含了引用行的主键列。

二级索引访问需要两次索引查找,而不是一次

以上就是 MySQL 中索引类型的实现原理是什么,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-03发表,共计1956字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)