Mysql索引底层数据结构选型
1、哈希表(Hash)
通过Hash算法,能快速检索数据
数据碰撞问题用链地址法
无法进行范围搜索
2、二叉查找树(BST)
解决哈希索引无法范围搜索的问题
极端情况下会退化成线性链表,自增主键必然会导致极端情况
3、红黑树
会自动调整树形态,使其保持平衡,调整会消耗性能
无法完全解决二叉查找树的问题
4、AVL树
绝对平衡的二叉树,更耗性能
根本解决了红黑数的问题
由于一个节点只存储一个数据,在磁盘IO上消耗过多时间
5、B树
由于从磁盘读取1B数据和1KB数据的时间基本一致
因此可以在一个节点上存储多个数据,这就是B树
即便如何,每个节点上存储的数据还是有限的
6、B+树
B树节点上存储的是数据,每个节点存不了很多数据
而B+树节点上存储的是索引,叶子节点上存所有的数据
相对B树,B+树的高度降低了,减少了磁盘IO
Mysql的索引用的就是B+树
Innodb引擎和MyISAM引擎的实现
MyISAM | Innodb |
不支持事务 | 支持事务 |
表锁 | 行级锁 |
数据和索引分开 (非聚集索引) | 数据和索引放一起 (聚集索引) |
索引树的叶子节点存储数据的物理地址 | 只在主键索引树的叶子节点存储具体数据,其他索引树的叶子节点存储主键。 当使用其他索引时,先在其他索引树中找到主键,再去主键索引树中找到具体数据。这样做是为了节省空间,避免每个索引树都保存数据(聚集索引),所以性能比MyISAM差点 |