MySQL——00

时间:2022-10-28 21:55:18

索引数据结构

MySQL中常见索引数据有B+Tree、Hash,其他几乎不用。

Hash

最简单,容易理解,其实用的也不多,因为有局限性

优点:

  • 一次内存运算即可定位,效率高

缺点:

  • 有可能hash冲突,这就会导致定位后拿到一个链表再进行遍历;
  • 不适用于范围查找,仅用于“=”、“IN”


MySQL——00


B+Tree

默认的索引数据结构

优点:

  • 层级少,定位效率高
  • 支持所有sql条件查询

缺点:

  • 非范围/排序类效率较Hash差


MySQL——00


B+Tree仅在叶子节点上会存储数据(非主键索引叶子节点存储对应主键索引地址),其他非叶子节点仅是索引。这就是相对于BTree的改进,在非叶子节点上能够存储更多的索引(MySQL默认每页存储空间应该是16K)。

这里以主键索引为例,假设主键为bigint,那非叶子节点每页可存储索引数为16K/×8+6),约等于1170,如果设置B+Tree为3层(两层非叶子节点+一层叶子节点),那两层非叶子节点就可存储近137万条索引,如果设置3层非叶子节点那就可以存储16亿条索引了。

别忘了还有一层叶子节点,假设每个叶子节点的数据都占用1K存储,那每页叶子节点就可以存16条数据。

B+Tree层级

存储数据量

3

2190万

4

256亿

如果换成BTree要达到过两千万的存储,需要有7层,这效率就立马下来了。