天天看点

Mysql InnoDB笔记(2)——表

本文笔记摘自于《Mysql 技术内幕 InnoDB存储引擎》

Mysql InnoDB笔记(1)——体系架构

Mysql InnoDB笔记(2)——表

Mysql InnoDB笔记(3)——索引

Mysql InnoDB笔记(4)——锁

Mysql InnoDB笔记(5)——事务

Mysql InnoDB笔记(6)——备份和性能调优

在InnoDB存储引擎中,所有表都是根据主键顺序存放的,如果没有显式定义非空的唯一索引,InnoDB会自动创建一个。

逻辑存储结构

如下图:

Mysql InnoDB笔记(2)——表

依次为:表空间(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等。

上一篇:Mysql InnoDB笔记(1)——体系架构

下一篇:Mysql InnoDB笔记(3)——索引

继续阅读