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树可保证查询效率,因为不会像二叉结构层次深。
记住几个专业术语: 根节点、叶子节点、关键字、阶、关键字个数、指针。
- 关键字个数: [ceil(m/2)-1] <= n <= m-1 (假设B树为m阶)
B树结构图
什么是B+树
B树的变形。
B+树的图
两者有什么不同之处
B树:
- 叶子节点不包含关键字信息 叶子节点没有指向孩子节点的指针
B+树:
- 所有叶子节点包含全部关键字信息,及指向含有这些关键字记录的指针,且叶子节点中关键字进行有序链接
- 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
- B树是非聚集索引,索引和数据分开存储。
- B+树聚集索引,索引和数据存在一起。
mysql索引为什么用B+树
- 查询效率高
为什么效率高,因为B+树遍历叶子节点就能遍历整棵树,基于范围查询。
B树提升了IO性能,却没解决循环遍历元素效率低的问题。 - 磁盘读写代价低
为什么?因为B+树内部节点没有指向关键字的指针,内部节点相对B数更小。
了解了mysql 索引底层有什么用
- 尽量设置主键自增
- 为什么?
因为如果设置非规律性索引,底层是B+树,会导致为了维护树的特性不断分裂,十分低效。
- 为什么?
- 主键字段不应过长,因为辅助索引引用主索引,主键过长导致辅助索引过长。