InnoDB 的表结构

10 篇文章 0 订阅

InnoDB是索引组织表,这种结构的存储是根据主键顺序组织的。InnoDB要求每张表都必须有一个主键,如果没有InnoDB会自己确定或添加一个主键

InnoDB的主键索引也称为聚集索引,是一个核心的索引,聚集索引采用B+ 树结构,每个索引项都包含了row数据,也就是通过索引可以定义到具体的row数据,无需二次IO。

索引组织表的主键确定

主键是索引组织表的核心,表数据按照主键顺序存储,InnoDB的主键确定过程如下:

  • 绝大部分表都显示指定(已经做了要求),而且指定为自增类型;
  • 如果没有指定,则查找有没有非null的unique索引,如果有,则该column为primary key;
  • 如果找到了多个not null unique index,则使用第一个,这个顺序是index的定义顺序不是table的定义顺序;
  • 如果不符合,则自动创建一个6字节大小的指针作为主键:_rowId;

组成

InnoDB基于表空间、段、区、页、行来组织数据。一个表空间包含多个段,每个段存储了不同类型的数据,如数据段、索引段。每个段由多个区构成,每个区有多个页,页是内存池中的基本管理单位,也是索引的基本单位,每个页包含多个行,行就是数据和核心。

  • 表空间:tablespace是数据的顶级组织和存放区域,存储了各种信息,数据,索引,事务信息等;
  • 段:segment可以分为数据段、索引段、回滚段,数据段是B+树的叶子节点,索引段是B+树的非叶子节点;
  • 区:extent 区的大小固定1M;
  • 页:page 默认16KB,1个区有64个page,
  • 行:row InnoDB的数据是按row存放(相比hive 按照column存放,导致二者差异性),每页最多存储79992行。

Varchar和char字段

由于InnoDB 数据行的存储格式的特点,InnoDB支持的Varchar最大为65535字节,但是由于还需要存储其他元信息,实际上varchar最大为65532字节,而且65535是所有varchar字段的总和,如果总和超过了该大小,需要使用text或者blob,某些sql级别下innoDB会自动转换。

还有就是如果每页数据存放不了2 row数据,则会出现行溢出现象,数据溢出会增大磁盘IO,所以varchar字段的总长度不要超过8098。

如果varchar太长,InnoDB创建时会使用text或者blob替换,但是text、blob类似指针方式存储,这也会加大磁盘IO,效率会下降。

char字段的单位是字符,表象上是固定长度,但是存储时也是一种另类的varchar,varchar的单位是字节,要注意区别,也就是char(2)在不同字符集下,ab和‘我们’都是一样存储的。

约束

约束是数据库的重要特征,InnoDB支持如下几种约束方式:

  • 类型约束:使用合适的数据类型,如int类型不能存储string;
  • 唯一约束:定义primary key或者unique index;
  • 外键约束:定义foregin key;
  • enum和set约束;
  • 使用触发器或者defalut来约束默认值;

约束的建立方式:

  • private key;
  • unique key;
  • foregin key;
  • not null;
  • defalut;

SQL 语句

create table xx (
    aa int defalut 1,
    bb varchar(800) not null,
    'sex' enum('1','0'),#不建议使用
    uniquey key(bb) , 
    primary key (aa)
)engine = innodb;

alert table xx add unique key idx_xx(aa);

crete index idx_xx on xx (aa);

create unique index idx_xx on xx (aa);

# 触发器 trigger
create trigger tr_aa {before|after insert|update|delete}
on xx for each row BEGIN
....
END

PS :

创建约束的同时基本上就等于创建了索引,但是索引更偏向物理上、性能上的优化,约束是逻辑上、业务上的完整性;

* 约束并不一定报错,要设置sql_mode 为 strict_trans_tables;*

* 每个表最多建立6个触发器 *

MyISAM不支持外键和事务。

分区

InnoDB和MyISAM、NDB都可以支持分区,但是有些存储引擎是不支持的。分区操作常见于程序性分区,数据库仅仅支持水平分区,不支持垂直分区。

垂直拆分:按照column拆分,拆分热点字段。

mysql仅仅支持局部分区,也就是数据、索引在一起,不支持全局分区,全局分区要求,数据分开,但是索引不分开。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值