MySQL之InnoDB中一棵B+树能存多少行数据

一、InnoDB一棵B+树可以存放多少行数据?(约2千万)

我们都知道计算机在存储数据的时候,有最小存储单元,这就好比我们今天进行现金的流通最小单位是一毛。在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是512字节,而文件系统(例如XFS/EXT4)他的最小单元是块,一个块的大小是4k,而对于我们的InnoDB存储引擎也有自己的最小储存单元——页(Page),一个页的大小是16K。
磁盘扇区、文件系统、InnoDB存储引擎都有各自的最小存储单元。

MySQL之InnoDB中一棵B+树能存多少行数据_第1张图片

在MySQL中我们的InnoDB页的大小默认是16k,当然也可以通过参数设置:
SHOW VARIABLES LIKE ‘innodb_page_size’;

在这里插入图片描述

数据表中的数据都是存储在页中的,所以一个页中能存储多少行数据呢?
假设一行数据的大小是1k,那么一个页可以存放16行这样的数据。

那么现在我们需要计算出非叶子节点能存放多少指针?
其实这也很好算,我们假设主键ID为bigint类型,长度为8字节,而指针大小在InnoDB源码中设置为6字节,这样一共14字节,我们一个页中能存放多少这样的单元,其实就代表有多少指针,即16KB(161024=16384 byte)16384/14=1170(索引个数)。那么可以算出一棵高度为2的B+树,能存放117016=18720条这样的数据记录。

根据同样的原理我们可以算出一个高度为3的B+树可以存放:1170(索引个数)*1170(索引个数)*16(每页行数)=21902400(2千万)条这样的记录。
所以在InnoDB中B+树高度一般为1-3层,它就能满足千万级的数据存储。在查找数据时一次页的查找代表一次IO,所以通过主键索引查询通常只需要1-3次IO操作即可查找到数据。

二、怎么得到InnoDB主键索引B+树的高度?

上面我们通过推断得出B+树的高度通常是1-3,下面我们从另外一个侧面证明这个结论。在InnoDB的表空间文件中,约定page number为3的代表主键索引的根页,而在根页偏移量为64的地方存放了该B+树的page level。如果page level为1,树高为2,page level为2,则树高为3。即B+树的高度=page level+1;下面我们将从实际环境中尝试找到这个page level。

SELECT
  b.name,
  a.name,
  index_id,
  TYPE,
  a.`SPACE`,
  a.`PAGE_NO`
FROM
  information_schema.`INNODB_SYS_INDEXES` a,
  information_schema.`INNODB_SYS_TABLES` b
WHERE a.`TABLE_ID` = b.table_id
  AND a.`SPACE` <> 0
  AND b.`NAME` = 'testdts/mycity'

在这里插入图片描述
可以看出数据库testdts下的mycity表、mycity表主键索引根页的page number均为3,而其他的二级索引page number为4。
B+树高度为page level+1=3;region表的page level为0,B+树高度为page level+1=1;customer表的page level为2,B+树高度为page level+1=3;

相关文章
MySQL MVCC实现原理
深入理解 MySQL 索引底层原理
MySQL数据库优化的八种方式
MySQL数据库优化-运维角度浅谈

你可能感兴趣的:(mysql,b树,数据结构)