当前位置: 代码迷 >> 综合 >> MYSQL 聚簇索引、非聚簇索引、InnoDB、MyISAM
  详细解决方案

MYSQL 聚簇索引、非聚簇索引、InnoDB、MyISAM

热度:34   发布时间:2023-12-26 17:20:32.0

MySQL数据库分为聚簇索引和非聚簇索引两种,也有人称为聚集索引和非聚集索引。

需要注意的是,聚簇索引和非聚簇索引不是一种单独的索引类型,而是一种数据存储方式

1.索引的实现

聚簇索引和非聚簇索引,都是使用 B+Tree 的数据结构实现的

为什么是使用B+Tree而不是B-Tree呢?
在这里我们就需要先了解B-Tree和B+Tree都是怎么实现的

图片为网上提供,如需标记出处请联系我进行修改
图片为网上提供,如需标记出处请联系我进行修改

由此可以看出,B-Tree结构每次查询时,都需要从根节点到叶子节点,假设第一次查询5,即在磁盘块5中时,需要从根节点到叶子节点,那第二次查询9,即在磁盘块6中时,还是需要从根节点到叶子节点。我们都知道,磁盘块5下一个磁盘块就是6了,照B-Tree的设计来说这种情况,明显存在着性能的缺陷,所以才有了B+Tree结构。

B+Tree结构在B-Tree的基础上增加了磁盘块与磁盘块之间的顺序访问,也有人说是数据块与数据块之间的顺序访问,提高了区间的查询效率。

2.聚簇索引

聚簇索引,是根据每张表的主键创建一颗B+Tree,并且每个叶子节点存储对应的行数据。每张表只能有一个聚簇索引。

优点
1.聚簇索引的B+Tree保存了完整的数据
2.主键唯一且有序,这样对主键进行排序查找和范围查询的效率更高

缺点
1.由于主键是顺序存入,导致在批量插入时必须等待上一个插入完成后才继续进行,这显然严重影响性能
2.由于B+Tree中主键是有序的,一旦更新主键,更新的行就会在树中进行移动,代价显然会很高
3.辅助索引(也叫二级索引)查询时,需要进行两次索引查找,第一次是在辅助索引中找到对应的主键,第二次是在主键索引中根据第一次找到的主键找到对应的完整的行数据

3.非聚簇索引

非聚簇索引,是根据每张表自定义的字段创建一颗B+Tree,并且每个叶子节点存储相应的主键。每张表可以有多个非聚簇索引。

优点
不影响表中数据的存储数据,所以对于数据的增删改影响较小,不需要对数据页进行移动

缺点
由于叶子节点只存储主键,不存储完整的行数据,需要进行两次查找才能完成,以致于查询效率会较低

4.存储引擎与索引

MySQL默认的是InnoDB存储引擎,另外还有很多种存储引擎,比如说InnoDB、MyISAM、BDB、MEMORY…这里主要针对InnoDB与MyISAM

InnoDB

InnoDB作为存储引擎时,要求每个表的数据必须依赖于主键

(面试题)InnoDB怎么保证必有主键?
当表中有primary key时,MySQL直接将该字段作为主键,当没有primary key时,MySQL会找到unique key(唯一索引)所在的字段,将该字段作为主键,当两者都不存在时,MySQL会在InnoDB内部生成一个隐藏的聚簇索引GEN_CLUST_INDEX,该索引包含行ID值的合成列上命名,这些行由InnoDB分配给表中各行的ID排序,行ID是一个6字节的字段,随着插入新行而单调递增。

InnoDB存储引擎中,数据文件和索引文件是同一个文件,其中索引包含了主键索引和辅助索引(辅助索引也可以没有)
主键索引是根据主键创建聚簇索引,存放表中全部的数据,而辅助索引是根据自定义字段创建的非聚簇索引,存放的是对应的主键。由于InnoDB必有主键,所以经常说InnoDB是聚簇索引的代表,不过其中的辅助索引其实就是非聚簇索引。

假设一个表中有id、name两个字段
当使用“where id = 1”查找时,则按照B树的检索算法查找对应的叶节点
当使用“where name=A”查找时,则需要两步,第一步在辅助索引B树中检索name,找到对应的主键,第二步在主键索引中检索出对于的行数据

InnoDB,提供了对数据库ACID事务(原子性、一致性、隔离性、持久性)的支持,同时还提供了行级锁和外键的约束,但是不会保存表的行数。MySQL运行时,InnoDB会在内存中建立缓冲池,缓冲数据和索引,但是不支持全文搜索

MyISAM

MyISAM存储引擎中,数据文件和索引文件是单独分离的
在MyISAM中,无论是主键索引还是辅助索引,都是非聚簇索引,在结构上两者没有什么区别,它们各自存放对应主键或辅助键,最后指向对应地址的表数据。不过,主键索引中key是唯一的,而辅助索引中key是可重复的。

MyISAM,不支持数据库ACID事务,也不支持行级锁和外键的约束,但是会保存表的行数。

网上看到助于理解的神图(如需标记出处请联系我进行修改)
图片为网上提供,如需标记出处请联系我进行修改

总结

InnoDB和MyISAM的区别:
1.InnoDB的数据文件和索引文件是同一个,MyISAM的数据文件和索引文件是分开的
2.InnoDB提供数据库ACID事务支持,MyISAM不支持
3.InnoDB提供行级锁和外键的约束,MyISAM不提供
4.InnoDB不保存行数,MyISAM保存行数

InnoDB和MyISAM如何选择使用?
1.当需要事务支持时,选择InnoDB
2.如果创建的表以大批量数据插入为主时,选择MyISAM,因为MyISAM执行批量insert时会比InnoDB快
3.如果创建的表以大批量数据更新为主时,选择InnoDB,因为InnoDB执行批量update时会比MyISAM快
4.大部分情况建议选择InnoDB


补充

MySQL提供了两种索引方法,一种是默认的BTREE,即B+Tree,另一种是Hash,比较少用少见,这里Hash就不过多叙述了

Hash索引的优点
键值唯一,哈希索引具有绝对的优势

Hash索引的缺点
1.无法完成范围查询检索,以及无法利用like完成模糊检索
2.无法利用索引完成排序
3.不支持多列联合索引
4.由于哈希碰撞问题,索引效率较低

既然Hash索引方法存在那么多不足,那么为何还存在,任何东西存在都是有必要的,当表不需要进行范围查询、模糊查询,也不需要多列联合索引…等等时,那么Hash显然是更好的选择

  相关解决方案