前言
在InnoDB存储引擎中,表都是根据主键的顺序组织存放的,这种存储方式的表称为索引组织表(index organized table)。在InnoDB存储引擎表中,每张表都有一个主键,如果创建表的时候没有显示的定义主键,InnoDB存储引擎会按如下方式选择或创建主键
- 首先判断表中是否有非空的唯一性索引,如果有,则该列为主键
- 如果不符合上述条件,InnoDB存储引擎自动创建一个6字节大小的指针
当表中有多个非空唯一索引时,InnoDB存储引擎选择建表时第一个定义的非空唯一索引为主键
InnoDB逻辑存储结构
约束
约束机制,保证了数据库中数据的完整性
数据的完整性:存储在数据库中的所有数据值均正确的状态。如果数据库中存储有不正确的数据值,则该数据库称为已丧失数据完整性。
InnoDB的几种约束
- Primary Key
- Unique
- Foreign Key
- Default
- NOT NULL
PRIMARY KEY 约束:
唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键
UNIQUE KEY约束:
唯一标识数据库表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。
请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束
FOREIGN KEY约束:
一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键)
约束和索引的区别?
约束是一个逻辑的概念,用来保证数据的完整性
索引是一个数据结构,既有逻辑上的概念,在数据库中还代表着物理存储的方式。
主键和索引的区别?
主键是一种约束,用来保证数据库中的数据完整性,
由于在数据库中为表定义主键将自动创建主键索引,所以也可以这样理解主键属于索引的一种,主键索引是唯一索引的特定类型。
那主键和唯一索引的区别?
-
主键一定是唯一性索引,唯一性索引并不一定就是主键。
-
一个表中可以有多个唯一性索引,但只能有一个主键。
-
主键列不允许空值,而唯一性索引列允许空值
那么实际使用中都有什么类型的索引呢?
UNIQUE:ADD UNIQUE INDEX('test');
NORMAL:ADD INDEX('test');
FULL TEXT:ADD FULLTEXT INDEX('test');
SPATIAL:ADD SPATIAL INDEX('test');
分区
当MySQL单表记录数过⼤时,数据库的CRUD性能会明显下降,⼀些常⻅的优化措施如下
- 垂直分区
将同一张表中不同列的记录分配到不同的物理文件中 - ⽔平分区
将同一张表中不同行的记录分配到不同的物理文件中(MySQL 支持)
除分区外其他的优化方法
- 限定数据的范围
务必禁⽌不带任何限制数据范围条件的查询语句。⽐如:我们当⽤户在查询订单历史的时候,我们可以控制在⼀个⽉的范围内;- 读/写分离
经典的数据库拆分⽅案,主库负责写,从库负责读;