mysql 引擎

MyISAM 引擎和 InnoDb引擎

用表对比:

引擎 主外键 事务 缓存 索引数据结构 关注点 表空间
MyISAM × × 表锁 只缓存索引 B+Tree 非聚集 性能
InnoDb 行锁 缓存索引和数据,对内存要求较高 B+Tree 聚集性 事务

什么是索引

索引:通过某种算法高效获取数据的一种数据结构。

数据结构

B-Tree 、B+Tree、B*Tree、红黑树
(重点说B-Tree和B+Tree),红黑树(底层是平衡二叉搜索树)

B-Tree 也叫B 树。B+Tree也叫B+树。

什么是B树

B树是多叉平衡查找树,可以联想到红黑树的二叉查找树。数据量大的时候,B树可保证查询效率,因为不会像二叉结构层次深。

记住几个专业术语: 根节点、叶子节点、关键字、阶、关键字个数、指针。

  1. 关键字个数: [ceil(m/2)-1] <= n <= m-1 (假设B树为m阶)

B树结构图

mysql索引底层原理

什么是B+树

B树的变形。

B+树的图

mysql索引底层原理

两者有什么不同之处

B树:

  1. 叶子节点不包含关键字信息 叶子节点没有指向孩子节点的指针

B+树:

  1. 所有叶子节点包含全部关键字信息,及指向含有这些关键字记录的指针,且叶子节点中关键字进行有序链接
  2. 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
  3. B树是非聚集索引,索引和数据分开存储。
  4. B+树聚集索引,索引和数据存在一起。

mysql索引为什么用B+树

  • 查询效率高
    为什么效率高,因为B+树遍历叶子节点就能遍历整棵树,基于范围查询。
    B树提升了IO性能,却没解决循环遍历元素效率低的问题。
  • 磁盘读写代价低
    为什么?因为B+树内部节点没有指向关键字的指针,内部节点相对B数更小。

了解了mysql 索引底层有什么用

  1. 尽量设置主键自增
    • 为什么?
      因为如果设置非规律性索引,底层是B+树,会导致为了维护树的特性不断分裂,十分低效。
  2. 主键字段不应过长,因为辅助索引引用主索引,主键过长导致辅助索引过长。

相关文章: