Mysql索引节点默认大小
如何查询每个节点的大小
show global status like 'Innodb_page_size';
[索引节点默认大小]
16384/1024=16,节点的默认大小为16KB,这个值是mysql经过多次试验出的一个理想值。 如果将这个值设置过大,可能会影响磁盘IO效率 如果将这个值设置过小,则索引能存放的数据响应就减少,相同的数据量情况下,会增加索引树的高度,从而使检索效率下降
如何设置Innodb_page_size大小
可通过修改my.ini配置文件,将innodb_page_size=设置的值更改
B+树索引高度为3的情况下,可以存放多少个数据?而不丧失检索效率
[示意图]
如果所示: 节点中, 如果索引是BIGINT字段(也就是我们常用的id),BIGINT为8个字节,指针地址为6个字节。一个节点的大小为16KB,也就是16384byte。 则头部节点能存放 16384 / (8+4) = 1170 二层节点一样,也是 16384 / (8+4) = 1170 三层节点,由于存放data,而日常中,data大约为1KB,则该节点能存放 16 / 1 = 16 条 所以B+树在高度为3的情况下,能存放 1170 * 1170 * 16 = 21902400个数据。 在不超过2000W条数据的情况下,mysql通过三次二分查找就能快速定位到检索的数据。
为什么mysql建议数据量超过2000W需要分表?
如果数据量增加,则索引高度为变成4层, 结果: 1.四层高度会增加检索I/O次数,检索效率降低 2.索引需要更多的时间来构建和维护 3.这也是为什么mysql建议超过2000W条数据需要分表的原因。
三层高度的情况下,需要IO几次?
mysql默认会把头部节点主动加载到内存中,则三层高度情况下,只需要加载二层和三层,所以需要I/O两次。