《丁奇-MySQL45讲-04》之归纳总结

04 | 深入浅出索引(上)

  • B+树特点:

1、非叶子结点不保存数据,只用于索引,所有数据保存在叶子结点。

2、叶子结点之间使用指针相连,并且按照从小到大的顺序排列。

3、子结点元素中的最大值或是最小值出现在父结点的元素中。

  • 哈希索引:以键值对的结构存储数据,只要输入键就可以找到对应的值,通过key计算出它要存储的位置,但可能会发生碰撞,就是不同的key落到同一个位置上了,这就形成了链表,是不是就是HashMap,增删改查都挺快的,明显的缺点就是不适合做范围查询,需要遍历整个数据,效率低下。

  • 有序数组:类比ArrayList,查询快、增删慢。

  • 二叉树:每个节点有左右子结点,而多叉树是有多个子结点(B+树就是多叉树),如果两者存储同样的数据,那是不是二叉树的树高明显比多叉树高,索引不仅存储在内存中,更会持久化到磁盘上,树越高,每次查找数据的IO次数就越多。而多叉树又有很多类别,为什么就选择B+树,其原因是B+树只有叶子节点存储数据,非叶子存储索引,所以在同样大小的数据页中可以存储更多的节点,也就是说查询同一个数据时所需要的IO次数更少,另外一方面是,无论如何查找,最终都会查到叶子节点上(因为数据在叶子节点),所以它查找性能是比较稳定的。

  • 主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。

  • 回表:普通索引,也就是通过二级索引找到对应的主键,在通过主键找到所需要的数据,这个过程就叫做回表,如果直接通过二级索引就能找到数据的话是不需要回表的。

  • 页分裂:B+树的叶子节点会按照从小到大的顺序排列,如果插入的主键要处于中间位置,那么需要移动后面的数据来腾出位置,而如果在插入之前数据页就已经满了的话,那么就需要将后面的部分数据移动至另外一个数据页上,这个过程就叫做页分裂。

  • 页合并:当相邻两个数据页由于删除了数据之后,整个的空间变小了,那么就会将两个数据页进行合并,以提高数据页空间的利用率。

  • 重建二级索引和重建主键索引:首先重建索引是为了让数据页的空间得到充分利用,也就省去了很多空间的浪费,对于重建二级索引来说是可以先删除掉索引在增加,对于重建主键索引的话如果先删除的话,它会使二级索引失效(由于重建主键索引,重新计算后的指针会发生变化),正确地重建主键索引是:ALTER TABLE T ENGINE = INNODB,或者是迁移数据库,不过这种方式只适合离线的业务。

posted @ 2021-03-14 15:24  zliawk  阅读(93)  评论(0)    收藏  举报