• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
redstone618
帮助1

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

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

学新通

在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数据库优化-运维角度浅谈

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggffkc
系列文章
更多 icon
同类精品
更多 icon
继续加载