当前位置:网站首页>MySQL索引

MySQL索引

2022-06-13 04:16:00 leejie*.

MySQL索引

什么是索引?

定义:索引是一种排好序的快速查找的数据结构,他帮助数据库高效的进行数据的检索。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(额外的存储空间),这些数据结构以某种方式指向数据,这样就可以在这些数据结构上实现高效的查找算法。这个数据结构就叫做索引。

索引一般以索引文件的形式存放在磁盘中,目前大多数索引都是采用B+树方式构建。

索引类型

主键索引

索引列中的值必须是唯一的,不允许有空值;

普通索引

基本索引类型,允许在定义索引的列中插入重复值和空值。

唯一索引

索引列中的值必须是唯一的,但是允许为空值。

全文索引

只能在文本类型CHAR,VARCHAR,TEXT类型字段上创建全文索引。字段长度比较大时,如果创建普通索引,在进行like模糊查询时效率比较低,这时可以创建全文索引。 MyISAM和InnoDB中都可以使用全文索引。

索引数据结构

mysql索引采用的数据结构为B+树,B树和B+树最主要的区别在于非叶子节点是否存储数据的问题。

B+树:只有叶子节点才会存储数据,非叶子节点只存储键值。叶子节点之间使用双向指针连接,最底层的叶子节点形成了一个双向有序链表。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yaCQYqoD-1654767182523)(C:\Users\Leejie\Desktop\leejie\笔记\image\B+Tree.png)]

B+树的最底层叶子节点包含了所有的索引项。B+树查找数据时。由于数据都存放在最底层的叶子节点上,所以每次查找都需要检索到叶子节点才能查询到数据。所以在需要查询数据的情况下每次的磁盘IO跟树高有直接的关系,由于数据都被放到了叶子节点,所以放索引的磁盘块所存放的索引数量是会跟着增加的,所以相对B树,B+树的树高理论上是比B树要矮的。也存在索引覆盖查询的情况,在索引中数据满足了当前查询语句所需要的全部数据,此时只需要找到索引即可立刻返回,不需要检索到最底层的叶子节点。

存储引擎

MySQL的两种存储引擎的索引实现:MyISAM索引和InnoDB索引。

myISAM索引

myISAM索引的数据文件和索引文件是分开存储的。MyISAM使用B+树构建索引树时,叶子节点中存储的键值为索引列的值,数据为索引所在行的磁盘地址。

注意:MyISAM在查询时,会将索引节点缓存在MySQL缓存中,而数据缓存依赖于操作系统自身的缓存,所以并不是每次都是走的磁盘。

InnoDB索引

InnoDB的主键索引也就是聚簇索引。每个InnoDB表都有一个聚簇索引,叶子节点存储的数据是整行记录。

InnoDB创建索引的具体规则如下:

  1. 在表上定义主键PRIMARY KEY,InnoDB将主键索引用作聚簇索引。
  2. 如果表没有定义主键,InnoDB会选择第一个不为NULL的唯一索引列用作聚簇索引。
  3. 如果以上两个都没有,InnoDB 会使用一个6 字节长整型的隐式字段 ROWID字段构建聚簇索引。该ROWID字段会在插入新行时自动递增。

除聚簇索引之外的所有索引都称为辅助索引。在中InnoDB,辅助索引中的叶子节点存储的数据是该行的主键值都。 在检索时,InnoDB使用此主键值在聚簇索引中搜索行记录。

使用辅助索引需要检索两遍索引:首先检索辅助索引获得主键,然后使用主键到主索引中检索获得记录。根据在辅助索引树种获取的主键id,到主键索引树检索数据的过程称为回表查询

覆盖索引

覆盖索引是一种很常用的优化手段。因为在使用辅助索引的时候,我们只可以拿到主键值,相当于获取数据还需要再根据主键查询主键索引再获取到数据。但是试想下这么一种情况,在上面abc_innodb表中的组合索引查询时,如果我只需要abc字段的,那是不是意味着我们查询到组合索引的叶子节点就可以直接返回了,而不需要回表。这种情况就是覆盖索引。

原网站

版权声明
本文为[leejie*.]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_43573186/article/details/125207882