MySQL的索引理解

文章摘要

  • 主要对数据库MySQL索引出现的一些重难点的理解。

1.索引的结构

  • MySQL的索引结构是基于B+树实现的,为的就是加快搜索。
1.1为什么索引要选择B+树这种数据结构?
  • B+树高度矮,每个树节点可以存储大量的索引数据,可以极大减少IO次数。
  • 为什么不用二叉搜索树,因为树太高了,IO次数多开销大,父节点和子节点可能不在一个磁盘。
  • 为什么不用跳表,跳表其实和B+树的效率差不多,但是高度还是比较高,每层的链表存储的结点比较少,涉及到IO次数较多,但是Redis就没有这样的问题,Redis是基于内存的数据库,不存在IO的问题。

2.索引的分类

  • 索引分类,一般分为主键索引和非主键索引。
  • 主键索引:不存在回表的情况,叶子结点存储着整个行的数据,是聚集索引。
  • 非主键索引:存在回表的情况,叶子结点存储着索引+主键,以便于回表查询其他信息,是非聚集索引。

3.覆盖索引

  • 覆盖索引是为了减少回表的索引,当非主键索引的叶子结点包含了需要查询的数据就不需要进行回表查询。

4.前缀索引

  • 前缀索引是指联合索引,前缀是指匹配规则,从最左边往右边进行匹配。所以往左边的索引的配置也有一些规范,尽可能小,尽可能不重复等。

5.索引下推

  • 索引下推可以减少查询表的次数,联合索引(judge1,judge2),当按照judge1进行筛选,当有judge2进行判断的时候,MySQL可以进行下推,减少过滤judge2筛选。

6.什么时候会重建索引

  • 存在表的数据减少了一半,表的大小依旧没变?因为还会存在很多的空节点,这些节点没有数据但可以用,表示存在一些空的索引。
  • alter table T engine=InnoDB进行重建索引,可以消除一些空的索引。

你可能感兴趣的