b-树 m阶
1 非叶子节点关键字个数 m/2<num <m-1 根节点1<num <m-1.
2 每个元素都保存关键字和数据。
3 节点中关键字比左侧孩子节点关键字大。节点中关键字都比右侧孩子节点关键字小。
b+树 m阶
1 非叶子节点关键字个数 m/2<num <m-1 根节点1<num <m-1.
2 非叶子节点只保存关键字。叶子节点保存关键字和数据。
3 叶子节点从小到大排列且都有一个指向下一个叶子节点的指针。
4 节点中关键字比左侧孩子节点中关键字大,小于等于右侧孩子节点中的关键字。
比较:
1 b+树由于非叶子节点中不存储数据,每个节点的大小设计为一页大小4k,不保存数据节点就可以保存更多的关键字,使得树深度(h)更小,索引数据库时可以减少IO操作。
2 b+树数据都在叶子节点保存,查找数据要到叶子节点,查询性能更稳定。b树所有叶子节点都保存数据,每个节点都可以查到数据,不稳定。
3 b+树叶子节点指向下一个叶子节点,形成有序链表,查找数据更方便。
关系数据库:
1 关系数据库索引文件保存在硬盘上,所以为了提高查找性能,需要减少访问硬盘的IO次数。使用B-,B+树可以减少IO访问次数。
2 B+树作为数据结构索引更好,因为非叶子节点不保存数据,只保存关键字。设计一个节点大小为一页4k,可以保存更多的关键字。那么树的深度就会更小,IO次数会更少。
叶子节点是有序链表,顺序查找更方便。
数据库引擎:
MyISAM引擎:使用B+Tree作为索引结构,叶节点的data域存放的是数据文件的数据记录地址。
InnoDB引擎:使用B+Tree作为索引结构, 数据文件本身就是索引文件。
主索引文件:必须有一个主索引文件(包括所有数据)。
辅助索引文件:叶子节点data只有主键的值,查询辅助索引时先根据辅助索引查到主键值,然后主键值根据主索引文件查询出所有记录。
了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大