为什么MySQL的索引要使用B+树而不是其它树形结构?比如B树?
因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;
InnoDB一棵B+树可以存放多少行数据?这个问题的简单回答是:约2千万。
计算机在存储数据的时候,有最小存储单元,这就好比我们今天进行现金的流通最小单位是一毛。在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是512字节,而文件系统(例如XFS/EXT4)他的最小单元是块,一个块的大小是4k,而对于我们的InnoDB存储引擎也有自己的最小储存单元——页(Page),一个页的大小是16K。
innodb的所有数据文件(后缀为ibd的文件),他的大小始终都是16384(16k)的整数倍。
其实每张表的根页位置在表空间文件中是固定的;
1、InnoDB存储引擎的最小存储单元是页,页可以用于存放数据也可以用于存放键值+指针,在B+树中叶子节点存放数据,非叶子节点存放键值+指针。
2、索引组织表通过非叶子节点的二分查找法以及指针确定数据在哪个页中,进而在去数据页中查找到需要的数据;
3、在查找数据时一次页的查找代表一次IO。
B+树的存放总记录数为:根节点指针数*单个叶子节点记录行数