mysql索引数据结构解析

mysql索引插入动图: https://www.cs.usfca.edu/~galles/visualization/flash.html

1、innodb 数据索引在同一文件
      mylsam 文件索引在不同文件
2、mysql为什么用b+tree数据结构做索引?

链表的时间复杂度为O(n)
红黑树为O(logn) ,mysql不用此作索引,原因是没有解决树的深度。因为每次只能取出一行数据,所以随着书的深度增加需要进行多少IO操作,
hash: 对name做hash,数据量大的情况下会出现hash冲突,碰撞,如果出现碰撞则会对key引入一个链表,增加了负责都,
       其次也解决不了排序,范围等问题。
btree: btree存在一个度的概念,达到后会分裂。降低了树的深度。btree会在索引下面挂载数据,造成度会很小。从而增加了树的深度。
b+tree: 优化了叶子节点,根节点会出现在叶子节点,形成一个有序叶子,非叶子节点不存储数据,叶子节点挂载数据。
    叶子节点之间形成的指针,更加适合顺序,范围查找,减少了io操作。
注意:
非主键索引,叶子节点存储的是主键。原因是:如果存在多个索引,叶子节点存储数据的话,则会造成数据重复和数据不一致的问题。
主键索引,叶子节点存储的是数据。

为什么不推荐主键用uuid?
1、uuid是无序的,每次插入数据会动态调整树的顺序,调整树的结构,
2、uuid占空间大32位。

innodb必须要有主键吗???
必须有,innodb会根据唯一键生成一个主键,如果没有的话innodb会生成一个虚拟主键。

猜你喜欢

转载自www.cnblogs.com/sunny-miss/p/11920414.html