本文笔记摘自于《Mysql 技术内幕 InnoDB存储引擎》
Mysql InnoDB笔记(1)——体系架构
Mysql InnoDB笔记(2)——表
Mysql InnoDB笔记(3)——索引
Mysql InnoDB笔记(4)——锁
Mysql InnoDB笔记(5)——事务
Mysql InnoDB笔记(6)——备份和性能调优
表
在InnoDB存储引擎中,所有表都是根据主键顺序存放的,如果没有显式定义非空的唯一索引,InnoDB会自动创建一个。
逻辑存储结构
如下图:
依次为:表空间(tablespace)–>段(segment)–>区(extent)–>页(page)–>行(row)
-
表空间(tablespace)
默认情况下,所有表数据都存放在一个共享表空间(ibdata1)里,可以使用参数innodb_file_per_table=ON
设置每张表使用单独的表空间。表空间刚申请的时候,如果创建的表数据小于1M,会先用32个页大小的碎片页来存放数据,使用完后才申请64个连续的页。
-
段(segment)
常见的段有:数据段、索引段、回滚段 -
区(extent)
区固定大小为1MB,默认的页大小为16kb,即1个区有64个连续的页。 -
页(page)
页是磁盘管理的最小单位 。可以通过innodb_page_size
来配置页的大小。
常见的页类型有:
数据页(B-tree Node)
undo页(undo Log Page)
系统页(System Page)
事务数据页(Transaction system Page)
插入缓冲位图页(Insert Buffer Bitmap)
插入缓冲空闲列表页(Insert Buffer Free List)
未压缩的二进制大对象页(Uncompressed BLOB Page)
压缩的二进制大对象页(compressed BLOB Page) -
行(row)
InnoDB的数据都是按行存放的。
存放行记录最多为16KB/2-200=7992行。
为什么???
行记录格式
-
Compact
Mysql 5.1版本开始默认的行格式,设计目的就是高效地存储数据。 -
Redundant
Mysql5.0之前版本的存储格式。
了解一下行溢出数据的概念
-
Compressed
-
Daynamic
Compact和Redundant属于Antelope文件格式
Compressed和Daynamic属于Barracuda文件格式
了解一下CHAR和VARCHAR的存储区别
数据页格式
由7个部分组成:
- File Header(文件头)
- Page Header(页头)
- Infimun和Supremun Records
- User Records(用户记录,即行记录)
- Free Space(空闲空间)
- Page Directory(页目录)
- File Trailer(文件结尾信息)
约束
约束的种类:Primary Key、Unique Key、Foreign Key、Default、NOT NULL
ENUM、SET 、触发器、外键,这些也是跟约束相关的,但实际项目中我们一般都不会使用。原因就是不好维护,或者影响性能。
视图
视图在实际项目中也很少用,我指的OLTP系统。别问为什么,我想没人会使用。
分区表
InnoDB自身支持水平分区,分区类型有以下几种:
- RANGE分区
- LIST分区
- HASH分区
- KEY分区
- COLUMNS分区
并且支持子分区,允许在RANGE和LIST的分区上再做HASH或KEY分区。
并不建议使用InnoDB自身的分区,使用不当,会扫描所有分区 ,增加磁盘IO次数,并且是倍数增加,相当坑。
建议使用成熟的分表中间件,如mycat、cobar、sharding-jdbc等。