Innodb引擎B+Tree
1.非叶子节点,不存放索引对应数据,存放的是下级叶节点中最小键值(表中主键),和子节点的指针(字节点地址信息)。
2.叶子节点存放的是索引值和索引所对应的数据,页中数据以链表形式存放,且是顺序存放。
3.页与页之间使用双向链表链接,每页数据大小为16KB,在InnoDB中B+树高度一般为1-3层,可以存放大约2千万条数据。
为什么说InnoDB中B+Tree可以存放2千万条数据。
在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是512字节,而文件系统(例如XFS/EXT4)他的最小单元是块,一个块的大小是4k,而对于我们的InnoDB存储引擎也有自己的最小储存单元——页(Page),一个页的大小是16K。
一般主键表中主键类型为INT(占四个字节)和BIGINT(占8个字节),指针大小在源码中设置为6个字节。也就是说一个page存储(16KB/(8B+6B)=1170个键值,可以算出一个高度为2的B+Tree可以存放1170*1170=1368900这样的数据。假设一条数据大小为1K那么一页可以存放16条数据(这里假设一行记录的数据大小为1k,实际上现在很多互联网业务数据记录大小通常就是1K左右)。那么高度为3的B+Tree可以存放1170*1170*16=21902400,所以在InnoDB中B+树高度一般为1-3层,它就能满足千万级的数据存储。在查找数据时一次页的查找代表一次IO,所以通过主键索引查询通常只需要1-3次IO操作即可查找到数据。
B+Tree支持范围查找。
因为B+Tree的叶子节点都是排好序的,当范围查询33-100时,只需要定位到最小值33的为位置,和最大值100的位置,然后直接取从33遍历链表直到100所在元素,就得到结果。
前缀匹配模糊查询:
假设主键是一个字符串类型,要查询where Key like abc%,其实可以转化成一个范围查询Key in [abc,abcz]。当然,如果是后缀匹配模糊查询,或者诸如where Key like %abc%这样的中间 匹配,则没有办法转化成范围查询,只能挨个遍历。
排序与分页:
叶子节点天然是排序好的,支持排序和分页。