Mysql杂志(二十)——MyISAM索引结构与B树B+树
MyISAM索引结构
我们先来说一个这个MyISAM的的索引数据结构,只要明白了主包上一篇的InnoDB的索引结构对这个就很好理解了,这个MyISAM的索引呢就很奇怪,说他是B树吧(B-Tree)也不是,B+树吧(B+Tree)也不是就很奇怪,可能是之前大家都叫B树吧,所以现在的MyISAM的成分就很复杂,但是主包认为他是B+树。
首先看这个AI画的图(不好意思偷懒了),很明确的区别就是InnoDB的叶子节点存的是索引以及完整的数据,而MyISAM却是索引和数据指针,然后再拿到这个数据指针再去.MYD文件中查找数据,也就是需要回表。
然后非叶子节点也就是目录页基本上都一样了,除了MyISAM没有槽位数组使用的是记录数组(键值数组)进行二分,其他的基本上一致都是索引列和数据页指针,都需要到数据页才能找到数据。
最后就是InnoDB到叶子节点也就是数据页是双向链表天然利好范围查询和线性查询,而MyISAM的叶子节点却是独立的,要范围查询又要查询循环索引树了。
这个就是架构差异,和对比表格,至于为什么说他既不是B树又不是B+树呢,我们先讲B树和B+树先。
维度 | MyISAM | InnoDB |
---|---|---|
索引结构 | 纯B树,二级索引无优化 | B+树,二级索引指向主键 |
数据组织 | 堆表,无序存储 | 聚簇索引,主键有序 |
查找效率 | 需二次查找(回表) | 主键索引直接定位 |
写入性能 | 追加写入快 | 需要维护索引有序性 |
并发控制 | 表锁,阻塞严重 | 行锁+MVCC,高并发 |
适用场景 | 读密集型静态数据 | 读写混合的OLTP |
B-Tree(B树)
B树是一种自平衡的树数据结构,它维护有序数据,并允许以对数时间进行搜索、顺序访问、插入和删除。B树经过优化,可减少在读写大数据块(如磁盘页)的存储设备上的访问次数,这使其成为数据库和文件系统的理想选择。优化了搜索二叉树的层级太高的问题。
说白了就是每个节点(不管是根节点还是内节点还是叶子节点都是)都存有数据,所以快的就很快可能一次io就命中索引了,直接就返回数据了,然后叶子节点没有然后链表,是一个孤岛,范围查询需要查询回溯索引。
B+Tree(B+树)
这个我们都已经了解了,从名字也可以看出来是B树的升级版,为了解决查询性能不稳定因为有的查询在根节点就结束,有的需要到叶子节点,还有缓存可能被非叶子节点的数据占用,挤掉更重要的叶子节点数据,以及B树没有高效的顺序访问机制,范围查询需要多次回溯树结构。
所以B+树一个特点就是只有叶子节点才有数据,非叶子节点都只有指向叶子节点的数据指针,还有就是叶子节点之间是双向链表,增加范围查询和线性扫描的优势。
特性 | B树 | B+树 | 影响 |
---|---|---|---|
数据存储 | 所有节点都存储数据 | 只有叶子节点存储数据 | B+树非叶子节点可存更多键,树更矮胖 |
叶子节点 | 互不连接 | 通过双向链表连接 | B+树范围查询效率极高 |
查找性能 | 不稳定(可能在内部节点找到) | 稳定(必须到叶子节点) | B树平均查找更快,B+树更稳定 |
范围查询 | 效率低(需要中序遍历) | 效率高(链表顺序遍历) | B+树适合数据库常见操作 |
空间效率 | 较低(每个节点都有数据开销) | 较高(非叶子节点无数据开销) | B+树能支持更大索引 |
扫描全表 | 需要遍历整棵树 | 只需遍历叶子链表 | B+树全表扫描快得多 |
这个是B树和B+树的使用场景维度图。
B树的优点:
可能在非叶子节点就找到数据,减少一次查找也就是点查询快,适合对写性能要求高、读模式简单的场景,如文件系统:快速定位文件元数据(inode),通常是随机点查询,还有:键值存储:简单的get(key)
操作,没有复杂查询,内存受限环境:对树高度敏感,希望尽量减少内存占用。
B+树的优点:
范围查询极快:叶子节点链表使BETWEEN
、ORDER BY
、GROUP BY
等操作极快。
高缓存效率:非叶子节点更小,更多热点数据可缓存。
查询稳定:所有查询都必须到叶子节点,性能可预测。
全表扫描快:顺序遍历叶子链表即可。
典型的使用场景有:关系型数据库(OLTP):大量范围查询和连接操作。数据仓库(OLAP):复杂的分析查询通常涉及大规模数据扫描。任何需要高并发和稳定响应的系统。
系统类型 | 读模式 | 写模式 | 推荐引擎 |
---|---|---|---|
OLTP数据库 | 点查询+范围查询 | 均衡 | B+树 |
OLAP数据仓库 | 复杂范围查询 | 批量导入 | B+树 |
缓存系统 | 极快点查询 | 高吞吐 | 哈希表 |
日志/事件流 | 少量范围查询 | 极高吞吐 | LSM-Tree |
文件系统 | 元数据点查询 | 频繁小写 | B树 |
为什么说MyISAM都不像?
从上面应该也可以知道为什么了吧,不想树的原因是只有叶子节点才有数据指针其他就没有,这一点和B+树一样,而叶子节点又不是双向链表这一点又不是B+树,又莫名其妙和B树一样,所以就谁都不像,但是称为B树主包认为当时还没有B+树,MyISAM从B树中进行升级,而后面InnoDB又从MyISAM的数据结构进行优化,才有后面的B+树。
总结
本篇主要讲了MyISAM的索引结构以及B树和B+树的区别。