二叉搜索树,B树,B+树,索引
mongodb的默认存储引擎WiredTiger使用了B树索引 mysql的默认存储引擎InnoDB索引使用了B+树实现,那么各自为什么这样实现呢? 二叉搜索树 如上图是一个简单的二叉搜索树,是最为大家熟知的一种数据结构,它为什么不适合用作数据库索引? (1)当数据量大的时候,树的高度会比较高,数据量大的时候,查询会比较慢 (2)每个节点只存储一个记录,可能导致一次查询有很多次磁盘IO B树 B树的特点是: (1)不再是单纯的二叉而是m叉 (2)叶子节点,非叶子节点,都存储数据 (3)中序遍历,可以获得所有节点 (4) 非根节点包含的关键字个数j满足, (┌m/2┐)-1 <= j <= m-1 ,节点分裂时要满足这个条件。 B+树 B+树,如上图,仍是m叉搜索树,在B树的基础上,做了一些改进: (1)非叶子节点不再存储数据,数据只存储在同一层的叶子节点上;B+树种 根到每一个节点的路径长度一样,而B树不是这样 (2)叶子之间,增加了链表,获取所有节点,不再需要中序遍历 这些改进让B+树比B树有更优的特性: (1)范围查找,定位min与max之后,中间叶子节点,就是结果集,不用中序回溯;范围查询在SQL中用得多,这是B+树比B树最大的优势。 (2)叶子节点存储实际记录行,记录行相对比较紧密的存储,适合大数据量磁盘存储;非叶子节点存储记录的PK,用于查询加锁,适合内存存储。 (3