0
点赞
收藏
分享

微信扫一扫

MySQL索引详解

芭芭蘑菇 2022-03-15 阅读 104

1、什么是索引

索引(index)是帮助MySQL高效获取数据的数据结构(有序)。一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。索引是数据库中用来提高性能的最常用的工具。

我们通常所说的索引,包括聚集索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说明,默认都是使用B+树结构组织(多路搜索树,并不一定是二叉的)的索引。

优势与劣势

优势:

劣势:

2 、索引结构(重要)

索引是在MySQL的存储引擎层中实现的,而不是在服务器层实现的。

MySQL目前提供了以下4种索引:

MyISAM、InnoDB、Memory三种存储引擎对各种索引类型的支持

索引

InnoDB引擎

MyISAM引擎

Memory引擎

BTREE索引

支持

支持

支持

HASH 索引

不支持

不支持

支持

R-tree 索引

不支持

支持

不支持

Full-text

5.6版本之后支持

支持

支持

我们平常所说的索引,如果没有特别指明,都是指B+树(多路搜索树,并不一定是二叉的)结构组织的索引。其中聚集索引、复合索引、前缀索引、唯一索引默认都是使用 B+tree 索引,统称为 索引。

BTree 与 B+Tree

BTree又叫多路平衡搜索树,一颗m叉的BTree特性如下:

MySQL 数据库使用最多的索引类型是BTREE索引,底层基于B+树数据结构来实现。

B+ 树是基于B 树和叶子节点顺序访问指针进行实现,它具有B树的平衡性,并且通过顺序访问指针来提高区间查询的性能。

进行查找操作时,首先在根节点进行二分查找,找到key所在的指针,然后递归地在指针所指向的节点进行查找。直到查找到叶子节点,然后在叶子节点上进行二分查找,找出 key 所对应的数据项。

为什么索引要用B+树来实现呢,而不是用二叉树?

B+树有个特点,就是够矮够胖,能有效地减少访问节点次数从而提高性能。

虽然二叉树也有很好的查找性能log2N,但是当N比较大的时候,树的深度比较高。数据查询的时间主要依赖于磁盘IO的次数,二叉树深度越大,查找的次数越多,性能越差。最坏的情况会退化成链表。所以,B+树更适合作为MySQL索引结构。

那又为什么不用B树呢?

因为B树的分支结点存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫。

而由于B+树的数据都存储在叶子结点中,叶子结点均为索引,方便扫库,只需要扫一遍叶子结点即可。所以B+树更加适合在区间查询的情况,而在数据库中基于范围的查询是非常频繁的,所以B+树更适合用于数据库索引。

3、 索引分类与设计原则

索引分类

聚集索引与非聚集索引

聚集索引严格来说并不是索引类型,而是一种数据存储方式,具体细节依赖于其实现方式。如innodb聚集索引的叶子节点存放了整张表的行记录(B+Tree)。

聚集索引类似字典的拼音目录。表中的数据按照聚集索引的规则来存储的。就像新华字典,整本字典是按照A-Z的顺序来排列。这也是一个表只能有一个聚集索引的原因。

聚簇索引相比非聚簇索引有什么优点?

数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快。

聚集索引叶子节点的存储是逻辑上连续的,所以对于主键的排序查找和范围查找速度会更快。

索引设计原则

最左前缀索引

创建复合索引:

就相当于

只要查询条件包含了name,就会利用索引查询

b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的。

比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;

但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。

比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。

4、索引优化

避免索引实效情况

举报

相关推荐

0 条评论