文章目录

  • 前言
  • 一、Mysql索引的数据结构
  • 二叉树/红黑树
  • B树
  • B+树
  • Hash索引
  • 二、索引类型
  • 聚簇索引/非聚簇索引
  • 主键索引/二级索引
  • 单列索引/联合索引
  • 覆盖索引
  • 三、存储引擎
  • InnoDB
  • Myisam
  • 总结



前言

大家好, 这里是Yve菌, 今天给大家带来一些Mysql索引相关的基础知识.


一、Mysql索引的数据结构

众所周知, Mysql索引的底层使用的是B+树, 同样都是树结构, Mysql为什么不能使用其他的树作为索引结构呢? 我们来分析一下

二叉树/红黑树

二叉树的特性为每个节点都只有两个子节点, 所以当数据量大时树的高度会比较高. Mysql会通过IO读取磁盘来寻找树的节点, 也就是说每查找一次数据也就会去磁盘IO读取一次树的节点, 也就是一页. 所以当我们数据量大的时候需要经过很多次IO才可以从头节点走到尾节点, 同理红黑树也是相同, 因此二叉/红黑树不适合作为Mysql的索引结构.

mysql索引树存在内存中还是磁盘中 mysql索引树结构_sql

B树

B树的特性为每个节点都有多个子节点, 子节点按照顺序排列. 但是B树在Mysql中的每一页(单个节点)不仅会存储索引, 同时也会存储数据, 这看起来没什么问题, 但是相对于B+树来说, B+树的每一页只会存储索引, 不存储数据, Mysql中每一页只有16k大小, 如果只存储索引不存储数据就可以存下更多的索引, 因此在存效率上来说B+树可以在每一页存储更多的索引.

mysql索引树存在内存中还是磁盘中 mysql索引树结构_mysql索引树存在内存中还是磁盘中_02

B+树

正如上面提到的, B+树的每个节点也都具有多个子节点, 每个节点按顺序排列只存储索引, 不存储数据, 叶子节点会存放所有数据, 并且叶子节点是使用指针相连的(B树没有指针相连), 因此B+树对于范围查找的效率也非常高

mysql索引树存在内存中还是磁盘中 mysql索引树结构_数据库_03

Hash索引

Hash同样也可以作为Mysql索引的数据结构, 因为Hash算法的高效性, 索引可以被很快速的找到, 但实际上Mysql并没有使用Hash作为索引结构, 这是因为使用Hash索引会导致索引冲突, 并且使用Hash索引只能通过精确查找才能搜索到索引, 而Mysql实际的业务中并不总是精确查找, Hash索引并不支持范围查找和模糊查找.

mysql索引树存在内存中还是磁盘中 mysql索引树结构_数据库_04

二、索引类型

在这里先提出一个概念–回表, Mysql的存储引擎中(后面会提到)索引的结构都是B+树, 但是并不是所有的索引类型都可以直接在叶子节点中获取到所有数据, 回表就是使用叶子节点中获取的数据作为索引, 去到另一张表中进行再次查询.

聚簇索引/非聚簇索引

按照物理结构来分, 索引类型可以被分为聚簇索引和非聚簇索引

  • 聚簇索引
    聚簇索引的叶子节点存储的是所有数据, 通过索引可以直接获取到需要的数据, 不需要回表
  • 非聚簇索引
    非聚簇索引的叶子节点存储的是聚簇索引的值, 也就是地址, 得到了聚簇索引的值后需要回表获取数据

主键索引/二级索引

按照字段分可以分为主键索引和二级索引

  • 主键索引
    主键索引就是按照主键字段来创建的索引, 通常来说聚簇索引就是使用主键来创建的, 通过主键作为索引来查找数据, 叶子节点通常存放的是主键对应的所有数据
  • 二级索引
    以非主键字段作为索引字段创建, 可以通过非主键字段来寻找到叶子节点的存储的主键的值, 如果还需要除了二级索引包含的字段就得回表

单列索引/联合索引

按照字段个数可以分为单列索引和联合索引.

  • 单列索引
    使用单列字段来创建索引, 因为单列索引效率通常没有联合索引高, 在创建索引时应当少创建单列索引.
  • 联合索引
    使用多个字段来创建索引, 字段排序顺序需要与创建索引时的字段顺序一致才可以匹配索引(Mysql内部有优化, 如果顺序不对会自动排序).

    创建联合索引时要遵守最左前缀原则, 也就是把最常用的字段放到最左边创建索引, 因为后续排序的顺序是会按照创建索引的顺序来的.

覆盖索引

这不是一种索引, 而是一种概念, 当我们需要的所有字段都可以直接通过二级索引获取到, 不需要回表获取时, 我们就可以说这属于覆盖索引.

三、存储引擎

在Mysql中有很多种存储引擎, 每个存储引擎使用的结构和功能都稍有不同, 存储引擎作用于表上, 表会根据不同的存储引擎以不同的方式存储, 现在我们常用的有InnoDB和Myisam存储引擎(通常使用InnoDB).

InnoDB

InnoDB的表结构在磁盘上由两个文件组成, frm文件存储表结构信息, ibd文件存储索引和信息. InnoDB内部使用的是聚簇索引, 通过ibd文件内部存储的索引进行搜索, 直接找到叶子节点的数据.

mysql索引树存在内存中还是磁盘中 mysql索引树结构_mysql_05

Myisam

Myisam的表结构在磁盘上由三个文件组成, frm文件存储表结构信息, MYI文件存储索引, MYD文件存储数据. Myisam内部使用的是非聚簇索引, 通过MYI中的索引获取到数据在MYD中对应的地址, 之后到MYD文件中回表获取数据

mysql索引树存在内存中还是磁盘中 mysql索引树结构_mysql索引树存在内存中还是磁盘中_06


总结

以上就是Mysql中索引的一些基础知识, 如果这篇文章能够帮到你的话就麻烦点个赞呗! 谢谢大家, respect!