1. InnoDB页的简介

InnoDB的存储文件有两个,后缀名分别是.frm和.idb;其中.frm是表的定义文件,.idb是表的数据文件

InnoDB是一个将表中的数据存储到磁盘上的存储引擎,即使关机后重启我们的数据还是存在;而真正处理数据的过程是发生在内存中,所以需要把磁盘中的数据加载到内存中;如果处理写入 或修改请求的话,还需要把内存中的内容刷新到磁盘上。而我们知道读写磁盘的速度非常慢,和内存读写差几个数量级,所以当我们想从表中获取几条记录,InnoDB存储 引擎需要一条一条的把记录从磁盘中读出来?不是,那样会慢死的,InnoDB采取的方式是:将数据划分为若干个页,以页作为磁盘和内存之间的交互的基本单位,InnoDB中页的大小一般为16KB。也就是在一般情况下,一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中

补充知识:计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是512字节,而文件系统的最小单元是块,块的大小是4K,而多于InnoDB存储引擎也有自己的最小存储单元--页(page),一个页的大小是16K

id in mysql 不能用not mysql idb_子节点

  • InnoDB页存储多少行数据

在MySQL中InnoDB页的大小默认是16k(16*1024b==16384),也可以通过参数设置[SHOW VARIABLES LIKE 'innodb_page_size';]

数据表中的数据都是存储在页中,假设一行数据的大小是1K,那一个页中最多存放16行这样的数据

  • 一颗B+tree存储多少行数据

B+tree树高为2,即存在一个根节点和若干个叶子节点,那这棵树存放总记录数为:根节点指针树*单个叶子节点的记录行数;

     说明单个叶子节点(页)中的记录数=16K(一页16KB)/1K(假设一行1KB)=16。(这里假设一行记录的数据大小为1k)

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

    根据同样的原理计算B+tree树高为3,可以存放1170(索引个数)*1170(索引个数)*16(每页行数)=21902400(2千万)条这样的记录

总结:InnoDB中B+tree树的高度为1-3层,就能满足千万级的数据存储,在查找数据时一次页的查找就代表一次IO,所以通过主键索引查询通常只需要1-3次IO操作即可查找数据

  1. InnoDB行格式

表中是一行一行的数据格式

InnoDB存储引擎是4种不同类型的行格式,分别是Compact  Redundant  Dynamic  Compressed