1、AVL树(平衡二叉树)、B Tree(多路平衡查找树)、B+Tree分别解决了什么问题? 2、为什么推荐使用递增的字段作为主键索引?(为什么不推荐使用UUID、身份证号作为主键索引)

1、AVL树(平衡二叉树)、B Tree(多路平衡查找树)、B+Tree分别解决了什么问题?

2、为什么推荐使用递增的字段作为主键索引?(为什么不推荐使用UUID、身份证号作为主键索引)

1.AVL树的一个重要的特点是:树的左右两边的层数之差不会大于一,从而解决了二叉树链表边可能会往一边倾斜的情况,变成一个单一的单向链表。

b树又叫座多路平衡二叉树,AVL树存在的问题是,如果数据量很大,就会导致树的深度很深,当需要找的值的位置,在树的较低层的时候,就会导致多次的i/o操作,而每次的i/o操作相对是比较浪费时间的,导致找到数据时,时间很长。对于b树而言,当每个page的存储大小是16kb时,而一条记录时1kb时,假设建值需要8bytes,向下的指针时6bytes,当树的深度为2时,可以存储2000多w的数据,从而大大降低了树的深度,也就大大降低了i/o的次数,降低了时间,提高了数据查找的效率。

B+树,相对与b树而言,添加了叶子节点上,数据库数据的排序链式索引。当需要查找多个数据之间数值差距不大的值,亦或者是,查找一个范围内的数值时,可以避免每一次的查找都需要从根节点走起,直接从当前的叶子节点走起,从而提高了扫库扫表、排序以及磁盘的读写能力。

2.身份证号和UUID的值的特点是一样的,就是新插入的数据具有随机性。我们知道对于InnoDB而言,主键索引是聚簇索引。当主键具有不确定性,需要插入的数据可能在B+树的叶子节点中间,就会导致叶子节点频繁的分裂,数据的存储和B+树的分裂不一致,page页新增时,出现磁盘存储的碎片化等一系列的问题,同时在需要进行 insert 操作,将会读取整个 B+ 树节点到内存,在插入这条记录后会将整个节点写回磁盘,这种操作在记录占用空间比较大的情况下,性能下降明显。而采用自增的字段作为主键时,每一次的插入都是在叶子节点的末尾,和b+树的分裂一致,提高了聚簇索引的存取效率,有效避免了磁盘的碎片化等一些了的问题,提高了磁盘的使用率。

你可能感兴趣的:(1、AVL树(平衡二叉树)、B Tree(多路平衡查找树)、B+Tree分别解决了什么问题? 2、为什么推荐使用递增的字段作为主键索引?(为什么不推荐使用UUID、身份证号作为主键索引))