Mysql+innodb数据存储逻辑

Mysql+innodb数据存储逻辑。

表空间由段,区,页组成

ibdata1:共享表空间。即全部的数据都存放在这个表空间内。若是用户启用了innodb_file_per_table,则每张表内的数据能够单独放到一个表空间内。(只是数据,索引和插入缓冲Bitmap页面。其余数据仍是放到共享表中。)mysql

表空间是由各个段组成,有数据段,索引段,回滚段等。数据与索引段都是用B+树数据结构。sql

是由连续页组成的空间,在任何状况下每一个区的大小都是1M,每一个区由64个连续的大小为16K的页组成。固然64个这个数目也是要以改变的。但区的大小1M是不能变的,当用记启用了参数innodb_file_per_table后建立的表大小默认为96K。前提是先用32个页大小的碎片页后。再申请64个连续页。充分利用碎片页提升存储效率。但会牺牲查找效率。数据库

innodb默认每一个大小为16K,1.2.X版本后能够设置>innodb_page_size将页大小设置为4K,8K,16K。数组

常见的页类型有数据结构

  • 数据页
  • undo页
  • 系统页
  • 事务数据页
  • 插入缓冲位图页
  • 插入缓冲空闲列表页
  • 未压缩的二进制大对象页(blog)
  • 压缩的二进制大对照页(blog)

页是由n行组成的,这个抽象跟现实生活中的书本的页是同样的。因此数据的记录格式是也是行格式。
mysql有compact和redundant两种格式来存放。mysql 5.1默认compact。行与行以前用链表结构链接起来,redundant主要是用偏移量还肯定数据的顺序。
行溢出问题:当行的数据超过16K页的大小,就是溢出。varchar因为数据库不同,页的大小也不同的。oracle是varchar2是4000字节,mssql的varchar是8000,mysql的varchar是65532字节。数据库是这样处理的:将溢出的类型数据放到blog页中。问题来了。
数据页的大小16K。即16384字节。为何varchar能够存储65532字节呢?
mysql是这样处理的:装溢出的数据放到4个未压缩blog中。4*16384=65535。将减去3位指针位就是65532。oracle

总结触类旁通

计算机全部的存储结构不外乎:数组,链表,哈希表,树,或是几种组合使用。
如:hashmap是哈希表,1.8后链表那块改为树减小了时间复杂度。内存管理,磁盘管理,编译器的语法树等。
建议非计算机专业的能够看看《数据结构》。不少代码的核心原理在里面均可以找到。指针

相关文章
相关标签/搜索