【HBZ分享】Mysql为啥使用B+树,而不是skip list跳表。 Redis为啥用skip list,而不是B+树?

B+ 树

  1. B+树是一个多叉树每个节点能存储16K的数据,每个非叶子节点只存主键值(主键索引)和指针,数据存于叶子节点
  2. B+树的一个节点大小 = innodb引擎的一页 = 4个操作系统页(一页4KB) = 16KB
  3. B+树存放记录数:根节点指针树 x 中间节点数 x 单个叶子节点记录数
  4. B+树每个节点能存放16KB数据,假设一行数据1KB, 那一个叶子节点就可以存16行数据
  5. 非叶子节点存放的是主键与指针,假设逐渐类型为bigint,占8个Byte,innoDB源码中指针占6Byte,一共14Byte,那一个主键+指针就是14Byte,所以单个叶子节点(页) 大概能存16KB / 14Byte = 1170个指针
  6. 那2层B+树可以存放117016 = 18720行数据, 3层B+树就能存放11701170*16 = 21902400行,大概2000W条数据
  7. 所以如果存储2000万数据,那B+树查询一次,数据也都在磁盘中,最多需要经过3次I/O

Mysql为什么使用B+树,而不是跳表

  1. 如果2000万数据用skip list存储,那根据规则,下层是上层元素的2倍,那大概需要24层的高度
  2. 如果数据分布情况不好,24层数据会分散再不同的数据页里,查一次要经过24次磁盘I/O
  3. 所以同样量级数据,B+树的高度要比跳表小得多,所以磁盘I/O次数是B+树更少,因此B+查询更快

Redis为什么使用跳表,而不是B+树

  1. Redis的读写是在内存操作的,相对数据量少,不会操作磁盘,因此不存在磁盘I/O,所以层高就不是跳表的缺点
  2. 写操作B+树要进行拆分索引,跳表是独立插入,没有旋转和维持平衡的开销,跳表的写入性能会更高

你可能感兴趣的:(mysql,b树,redis)