Mysql原理之B+树和索引

946 阅读3分钟

执行流程

执行流程
执行流程

真正的瓶颈是磁盘IO

B树

  • 要想优化当前数据库,关键是减少磁盘IO次数,而影响IO次数的关键因素就是树的层级(深度)
  • B树有个阶的概念,比如3阶B树, B树每个节点可以存多行数据(二叉平衡树每个节点只存一行数据),且每个节点可以连接至少2个节点,但最多连接数不超过M(M是当前的B树的阶数)
三叉树
三叉树

这样组织的好处是,每次加载一个节点时都可以从磁盘带出更多条数据,从而减少磁盘IO次数。

B+树和索引

  • 操作系统心中有个叫页的概念,是用来存储数据的一种单位,大小为4K。Mysql中也有页的概念,但大小是16k,你可以理解为MySQL中的“页”就是上面B树的一个个节点
  • 为了尽可能使树“变矮”从而减少磁盘IO,最好的做法是让一个节点尽可能地塞入更多的数据。

所谓的B+树,就是把原先B树中分散在各个节点的数据都“赶到”最底层的叶子节点,

非叶子节点只存储主键-addr形式的数据

image.png
image.png

B+树的两个重要特征:

  • 非叶子节点不存数据
  • 叶子节点数据用链表相连
image.png
image.png
  • 叶子节点是有序链表,可以帮助做范围查询。

总结:

  • B树的所有节点都会存储行数据,一个节点容量有限,而B+树非叶子节点只存储主键,能容纳更多数据

  • 由于非叶子节点能容纳更多数据,那么同一个节点能指向更多下级节点,所以相同数据量时,B+树更加“矮”,IO更少

  • B树的查询效率是不稳定的,最好情况是根节点,最差情况是叶子节点,而B+树是稳定的

  • B+树的叶子节点是有序列表,非常便于范围查询

  • 非聚簇索引(MyISAM)

    • 非聚簇索引(MyISAM)
      非聚簇索引(MyISAM)
    • 索引树是独立的,通过辅助键检索无需访问主键的索引树
    • 非聚集索引(mysql中除主键外的索引)会存主键的id,如果想要的信息不在索引列中,就会回表然后依靠主键id查找具体信息(回表)
  • 聚簇索引(InnoDB)

    • 主键索引:叶子节点是表数据
    • 非主键索引(唯一索引、普通索引):叶子节点是主键,必要时需要根据主键回表查询
    • 覆盖索引解决二级索引回表查询问题。但是前提是一定得注意查询时候索引的最左侧匹配原则。(每次给字段加一次索引,所对应的内容就会被复制出来一份。如果为一个索引指定两个字段,那么这个两个字段的内容都会被同步至索引之中。)

非聚集索引和聚集索引的区别在于,通过聚集索引可以查到需要查找的数据,而通过非聚集索引可以查到记录对应的主键值 ,再使用主键的值通过聚集索引查找到需要的数据

聚集和非聚集索引不管以任何方式查询表,最终都会利用主键通过聚集索引来定位到数据,聚集索引(主键)是通往真实数据所在的唯一路径。