今天整理了一下 MySQL 的索引,一般人只知道3~4个,但我经常听到有10几个之多,如下图:
文章插图
索引
是不是很多都听过,但是只是想不起来 。我大概归了一下类:
文章插图
索引分类
密度按照密度分,可分为稠密索引和稀疏索引,我们常见的MySQL Innodb 引擎使用的是稠密索引 。一般列式数据库采用的是稀疏索引,如 Clickhouse 。
稠密索引稠密索引(Dense Index)也称为完全索引,是一种将每个记录(行)都映射到一个索引项(Index Entry)的索引方式 。这种索引方式对于每一条记录都会创建一个索引项,因此它可以支持高效的查询和排序操作 。但是,由于每个记录都需要一个索引项,因此它会占用更多的存储空间,特别是在大型表中使用时 , 可能会导致索引文件的过大,从而降低查询性能 。
稀疏索引稀疏索引(Sparse Index)也称为部分索引,是一种仅为部分记录创建索引项的索引方式 。它仅为某些值创建索引项 , 而其他值则没有索引项 。这种索引方式可以减少索引文件的大?。?并且可以提高插入和更新的性能 。但是,由于它需要进行更多的磁盘访问来执行查询操作,因此查询性能可能会受到影响 。
文章插图
稠密索引和稀疏索引
存储按照存储分类,可以分为聚簇索引和非聚簇索引 。
聚簇索引聚簇索引(Clustered Index)是一种索引方式 , 它将数据存储在磁盘上,并且按照索引的顺序进行排序 。它可以将相邻的行存储在相邻的磁盘页上,从而提高查询的性能 。聚簇索引只能为表创建一个索引,因为每个表只能以一种方式进行排序 。聚簇索引对于经常需要根据特定列进行查询的表非常有用,因为它们可以快速定位数据 。
非聚簇索引非聚簇索引(Non-Clustered Index)是一种索引方式 , 它将索引数据存储在单独的数据结构中 , 而不是存储在表的磁盘上 。它包含了指向表中每行的指针 , 并按照索引列的顺序进行排序 。这种索引方式可以为表创建多个索引,并且可以根据多个列进行排序 。非聚簇索引对于经常需要根据不同的列进行查询的表非常有用,因为它们可以快速定位数据 。
在使用聚簇索引时,需要注意以下几点:
- 每个表只能有一个聚簇索引 。
- 聚簇索引的排序方式对查询性能有很大的影响,因此需要仔细选择聚簇索引的列 。
- 聚簇索引的创建和维护可能会占用较多的磁盘空间和时间 。
- 非聚簇索引可以为表创建多个索引 , 因此可以根据多个列进行排序 。
- 非聚簇索引可以减少查询时间 , 但是需要额外的空间存储索引数据结构 。
- 对于经常进行插入、更新和删除操作的表,非聚簇索引需要频繁更新,因此可能会影响性能 。
B+树索引B+树索引是一种常用的数据库索引结构,它是基于B树的一种变体 。B+树索引与B树的区别在于,它的非叶子节点不存储数据,只存储索引,而所有数据都存储在叶子节点中 。这种结构使得B+树索引的查询速度更快,因为在进行范围查询时,只需要遍历叶子节点即可 。
B+树索引的特点如下:
- 所有数据都存储在叶子节点中,非叶子节点只存储索引,因此可以存储更多的索引数据 。
- 叶子节点之间形成一个有序的链表,方便进行范围查询 。
- B+树索引的深度较浅,因此查询速度快,同时也减少了磁盘I/O操作的次数,提高了性能 。
文章插图
B+树
Hash索引Hash索引是一种基于哈希表实现的数据库索引结构 。在Hash索引中,每个索引项包含两部分,一个是关键字的哈希值,另一个是指向存储该关键字的数据块的指针 。
Hash索引的查询速度非常快 , 因为它通过哈希函数将关键字转换为固定长度的哈希值,然后根据哈希值直接访问索引项 。由于哈希值是唯一的,因此可以直接找到存储数据的位置,不需要进行比较操作 。
推荐阅读
- 为什么越来越多的人选择PostgreSQL,放弃了MySQL
- 十一出游,粉色套装穿搭优雅迷人,成为旅途中的一道亮丽风景线
- 健康饮食十五要
- 钓活虾的几种方法
- 十二生肖取名之牛宝宝取名怎么取 十二生肖取名之牛宝宝取名
- 十大最有营养食物的启示
- 吃牛肉的十大好处
- 混用筷子传染胃病
- 几种食物不能吃新鲜
- 别老吃一种食用油