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会自动创建一个。

逻辑存储结构

如下图:
在这里插入图片描述

依次为:表空间(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)——索引

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值