表的概念 |
表是关于特定实体的数据集合,比如用户表,加分记录表等。
特点:
(1)在InnoDB中,表都是根据主键顺序组织存放的,所以又名“索引组织表”
(2)每个表中必有主键,一般是在创建表时指定。如果没有指定:
先查看表中是否有非空的唯一索引,如果有,则为主键。如果有多个,则选择第一个定义的。
如果没有非空的唯一索引,其会自动创建一个6字节大小的指针。
逻辑存储的结构 |

(1)表
在上一篇的介绍日志文件博客中,我们说过,在默认情况下InnoDB有一个共享表空间ibdata1,所有数据都存放在这个表空间内。
如果用户启用了innodb_file_per_table这个参数,则每张表内的数据可以单独放到一个表空间内。我们可以将数据、索引和插入缓冲Bitmap页存放到这个单独的表空间中,其他类的数据,如回滚信息,二次写缓冲等还是要放在共享表中。
(2)段
段是表的组成部分,对段的管理是由引擎自身完成的,人为不能干预。段分为3类:
- 数据段:B+树的叶子节点
- 索引段:B+树的非索引节点
- 回滚段:
(3)区
区是段的组成部分,区的大小为1MB。默认情况下,页的大小为16KB,也就是说,一个区中一共有64个连续的页。
在每个段开始时,InnoDB会先用32个碎片页来存放数据,在使用完这些碎片页之后,才开始使用64个连续页。
(4)页(块)
页是InnoDB磁盘管理的最小单位。在上面我们也说过,页的默认大小为16KB,当然我们也可以使用innodb_page_size将页的大小设置为4K、8K、16K。当设置完成后,所有表中页的大小均为此大小,除非新建库,否则不能对其进行修改。页的内部存储结构如下:
(5)行
每个页最多存放7992行的记录。InnoDB提供了2种格式来存放行记录数据:
- Compact
- Redundant
约束 |
约束的作用就是为了保证数据库中的数据完整性。其有3种形式:
- 实体完整性:保证一个表中只能有一个主键
- 域完整性:保证每列的值需满足特定的条件
- 参照完整性:保证两张表之间的关系
和索引的区别
约束是一个逻辑的概念,用来保证数据的完整性。而索引是一个数据结构,既有逻辑上的概念,在数据库中还代表着物理存储的方式。
对错误数据的约束
在默认设置下,mysql数据库允许非法的数据插入或更新。比如向一个NOT NULL的字段插入一个NULL值,mysql会将其更改为0再插入,而不是报错。如果想让数据库严格审核输入的参数,可以设置sql_mode参数。
对离散值的约束
对离散值的约束可以使用enum和set。
create table a(id INT,set ENUM('male','female'));
对连续值的约束
对连续值的约束可以使用触发器来实现。触发器的作用就是在执行insert、delete、update命令之前或之后自动调用sql命令或存储过程。这有点AOP的思想。
一个表最多可以建立6个触发器,在“增删改”的前后各加一个。建立命令如下:
create trigger
视图和分区 |
视图
视图是一个虚拟的表,是一组数据的逻辑表示。其本质是对应于一条select语句,结果集被赋予一个名字,即视图名字。
视图本身并不包含任何数据,它只包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之变化。
分区
分区是将一个表或索引分解为多个更小、更可管理的部分。mysql只支持水平分区。分区的类型有很多种:range、list、hash等。
其中range最常用,比如我们创建表时,可以根据id值的范围来进行分区,id小于10的放入p0分区,大于等于10的放入p1分区。