B树、B+树及索引

B树:

    每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为null。

B+树:

    只有叶子节点存储data,叶子节点包含了这棵树的所有键值,叶子节点不存储指针。后来在B+树上加了顺序访问指针,也就是每个叶子节点增加一个指向相邻叶子节点的指针。可以像遍历链表一样遍历叶子节点。B+树是数据库系统实现索引的首选数据结构。

    一般来说,索引很大,往往以索引文件的形式存储在磁盘上,索引查找时产生磁盘I/O消耗,相对于内存读取,I/O存取的消耗要高几个数量级,评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘IO操作次数的时间复杂度。树高度越小,IO次数越少。

    用B+树而不是B树的原因是B+树内节点不存储data,这样一个节点可以存储更多的key。

    在mysql中,最常用的两个存储引擎是MyISAM和InnoDB,它们对索引的实现方式是不同的。

MyISAM:data存放的是数据地址。索引是索引,数据是数据。

InnoDB:data存的是数据本身,索引也是数据。

  • 事务处理方面,MyISAM强调的是性能,查询的速度比InnoDB快,但是不提供事务支持,InnoDB提供事务支持;
  • 外键,InnoDB支持外键,MyISAM不支持;
  • 锁,MyISAM只支持表级锁,InnoDB支持行级锁和表级锁,默认是行级锁,行锁大幅度提高了多用户并发操作的性能。InnoDB适合插入和更新比较频繁的操作,MyISAM适合频繁查询的情况。
  • 全文索引,MyISAM支持全文索引,InnoDB不支持全文索引,从mysql5.6版本开始提供对全文索引的支持;
  • 表主键:MyISAM允许没有主键的表存在,InnoDB如果没有设定主键,就会自动生成一个6字节的主键;
  • 表的具体行数:MyISAM内置一个计数器,计数时直接从计数器读;InnoDB不保存表的具体行数,计数时需要扫描一遍整个表来计算有多少行。

B+树索引和hash索引

B+树是一个平衡的多叉树。B+树从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动;

哈希索引采用一定的哈希算法,把键值换成新的哈希值,检索时不需要类似B+树那样从根节点逐级查找,只需一次哈希算法即可定位到相应的位置。

  • 哈希索引的优势:等值查询。哈希索引具有绝对优势(前提是没有大量重复键值,如果有大量重复键值时,哈希索引的效率很低,因为存在所谓的哈希碰撞问题。)
  • 哈希索引不适用的场景:不支持范围查询;不支持索引完成排序;不支持联合索引的最左前缀匹配规则

猜你喜欢

转载自blog.csdn.net/hellodake/article/details/82657921