一般使1~3层,可以存储大约2千万行数据
- InnoDB存储引擎默认最小存储单元是页,默认一个页的存储大小是16K(可以修改,通过设置参数innodb_page_size)
- InnoDB的所有数据文件(后缀为ibd的文件)它的大小始终是16K的整数倍
- 页可以存储数据也可以存储键值+指针,在B+树叶子节点存放数据,非叶子节点存放键值+指针
- 如果这一页存储的是非叶子节点,假设主键id为bigint类型,长度为8个字节,指针在InnoDB中是6个字节。这样一共14个字节,则一页能能存储多少个这样的单元,就代表一页能存储多少指针,即大约16384/14=1170个指针
- 如果这一页存储的是叶子节点,假设一行记录大小为1K(实际上很多互联网业务数据记录大小通常就是1K左右),则一页可以存储16条记录。
- 若一颗高度为2的B+树,则能存放大约1170*16=18720条记录
- 同样,若一棵高度为3的B+树,能存放1170*1170*16=21902400。即约两千万条数据。
- 所以InnoDB中B+树的高度一般为1~3层,就能满足千万级的数据存储
- 在查询数据时一次页的查找代表一次IO,所以通过主键索引查询通常只需要1~3次IO操作即可查找到数据。
补充:数据块的三层表示
- disk层:最小的块单位是扇区,一个扇区512字节
- 文件系统层:是基于disk层的。也是以块为单位,在linux中一个块是4k字节,即需要8个扇区
- 数据库层:是基于文件系统层的,也是以块(页)为单位,以mysql为例,一个块默认16k字节。