MYSQL-B+多路平衡查找树
B+树索引
B+树好处
B+分列
2.为什么选择B+树,不用Hash做索引??
3.为什么使用主键自增索引??
- B+树是有序的,如果主键不是自增的话,可能带来叶子节点的迁移,—数据移动浪费性能;移动过程中如果数据页已满,需要进行页分裂操作
- 如果是自增的,,后面的ID比前面的大,会直接定位,所存储的页。
MYSQL的B+Tree索引树高度如何计算??
前一段被问到一个平时没有关注到有关于MYSQL索引相关的问题点,被问到一个表有3000万记录,假如有一列占8位字节的字段,根据这一列建索引的话索引树的高度是多少?
假设平均指针大小是4个字节,那么索引树的每个节点可以存储16k/((8+4)*8)≈171。那么:一个拥有3000w数据,且主键是BIGINT类型的表的主键索引树的高度就是(log2^25)/log171 ≈ 25/7.4 ≈ 3.38。
假设平均指针大小是8个字节,那么索引树的每个节点可以存储16k/((8+8)*8)≈128。那么:一个拥有3000w数据,且主键是BIGINT类型的表的主键索引树的高度就是(log2^25)/log128 ≈ 25/7 ≈ 3.57
由上面的计算可知:一个千万量级,且存储引擎是MyISAM或者InnoDB的表,其索引树的高度在3~5之间。
数据库中B+树索引分为聚集索引(clustered index)和非聚集索引(secondary index).
这两种索引的共同点是内部都是B+树,高度都是平衡的,叶节点存放着所有数据。不同点是叶节点是否存放着一整行数据。
(1) 聚集索引(innoDB)
Innodb存储引擎表是索引组织表,即表中数据按主键顺序存放。而聚集索引就是按每张表的主键构造一颗B+树。并且叶节点存放整张表的行记录数据。每张表只能有一个聚集索引(一个主键)。
聚集索引的另一个好处是它对于主键的排序查找和范围的速度非常快。叶节点的数据就是我们要找的数据。
(2)高度计算
InnoDB存储引擎默认一个数据页大小为16kb,非叶子节点存放(key,pointer),pointer为6个字节,key为4个字节,即非叶子节点能存放16kb/14左右的key,pointer,而叶子节点如果一条数据大小为100字节,那一个叶子节点大约可存放160条数据。
如果高度为3,则可存放数据为:16kb/14 * 16kb/14 * 160大约1亿多数据。
因此InnoDB存储引擎b+树的高度基本为2-3.
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210311223727821.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rvbmc4NjMzO