一颗B+树的层高最好控制在3层之内,到第4层性能会急剧下降。
计算机存储数据时,一个扇区512KB,一个文件是4KB,innodb存储一页是16KB,innodb的所有文件大小一定是16KB的整数倍,一定是16384 byte的整倍数。
一个叶子节点有多少字节可以存放指向下一节点的指针,取决于主键的类型,比如bigint是8字节,而指针又占用6字节,所以指针可以指向1170个非叶子节点:
16384 / (8+6)= 1170 个非叶子节点
同理,指向叶子节点的个数也可以是1170个,那么3层高的一颗B+树可以存储:
第一层指向1170个非叶子节点,第二层再指向1170个叶子节点,1170 * 1170 = 1368900 个叶子节点
那么假设一条记录1KB大小,那么一页16KB就可以存储16行,那么 16行 * 1368900 个叶子节点 = 21902400 行。
【结论】
在每行数据是1KB的情况下,3层高的B+数可以存放2190万多条数据。
【为什么mysql使用B+树?而不是B树?】
因为B树的非叶子节点也存储数据,而B+树只有在叶子节点才存储数据,所以B树因为存放了数据,所以能放指针的地方就变少了,那要保存同样多的数据,就一定要增加树的高度,如果运气好,那么可能在中间的叶子节点就能找到,如果运气不好,那么需要找很多节点才能找到,这个性能是不稳定的。
【HashMap适合做数据库索引吗?】
1、数据量很大的时候hash冲突也很大
2、不支持排序
3、不支持range范围取值
【密集索引和稀疏索引】
如果这个索引树上不仅有指定的索引列的值,还有其他列的值,那么就是密集索引,比如主键索引。
只保存了构成了索引的列,比如组合索引a,b,c,那么该索引树只包含了a,b,c三个列的值,没有保存其他更多列的值,就是稀疏索引,那么所有二级索引都是稀疏索引。
【mysql合并sql语句】
insert into t1 values(...),(...),(...); 合并了sql语句
end.