其他
拜托,别再问我什么是 B+ 树了
The following article is from 码海 Author 码海
作者|码海
来源|码海(ID:seaofcode)
为啥索引常用 B+ 树作为底层的数据结构 除了 B+ 树索引,你还知道什么索引 为啥推荐自增 id 作为主键,自建主键不行吗 什么是页分裂,页合并 怎么根据索引查找行记录
定义问题 几种常见的数据结构对比 页分裂与页合并
定义问题
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL COMMENT '姓名',
`idcard` varchar(20) DEFAULT NULL COMMENT '身份证号码',
`age` tinyint(10) DEFAULT NULL COMMENT '年龄',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息';
根据某个值精确快速查找 根据区间值的上下限来快速查找此区间的数据 索引值需要排好序,并支持快速顺序查找和逆序查找
几种常见的数据结构对比
针对哈希索引,只有精确匹配索引所有列的查询才有效,比如我在列(A,B)上建立了哈希索引,如果只查询数据列 A,则无法使用该索引。 哈希索引并不是按照索引值顺序存存储的,所以也就无法用于排序,也就是说无法根据区间快速查找 哈希索引只包含哈希值和行指针,不存储字段值,所以不能使用索引中的值来避免读取行,不过,由于哈希索引多数是在内存中完成的,大部分情况下这一点不是问题 哈希索引只支持等值比较查询,包括 =,IN(),不支持任何范围的查找,如 age > 17
若左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值; 每个非叶子节点的左右子树的高度之差的绝对值(平衡因子)最多为1。
页分裂与页合并
怎么根据索引查找行记录
关于 B+ 树的总结
每个节点中子节点的个数不能超过 N,也不能小于 N/2(不然会造成页分裂或页合并) 根节点的子节点个数可以不超过 m/2,这是一个例外 m 叉树只存储索引,并不真正存储数据,只有最后一行的叶子节点存储行数据。 通过链表将叶子节点串联在一起,这样可以方便按区间查找
【END】