- 设定为主键约束(PRIMARY KEY)后,自动会为主键列创建主键索引,主键索引列值唯一非空。
示例
CREATE TABLE t_user(
id INT(10),
PRIMARY KEY(id),
…
);
CREATE TABLE t_user(
id INT(10) PRIMARY KEY,
…
);
Query OK, 0 rows affected (0.05 sec)
示例
ALTER TABLE temp
ADD PRIMARY KEY(id);
Query OK, 0 rows affected (0.15 sec)
Records: 0 Duplicates: 0 Warnings: 0
InnoDB 中的主键
- InnoDB 表中主键是必须存在的
- 对于InnoDB存储引擎的表,记录默认会按照一定的顺序保存,如果有明确定义的主键,则按照主键顺序保存。如果没有主键,但是有唯一索引,那么就是按照唯一索引的顺序保存。如果既没有主键又没有唯一索引,那么表中会自动生成一个内部列,按照这个列的顺序保存。
- 建立主键索引的数据类型必须是有序的,若表的主键不是顺序的id,而是无规律数据,比如字符串,InnoDB无法加单的把一行记录插入到索引的最后,而是需要找一个合适的位置(已有数据的中间位置),甚至产生大量的页分裂并且移动大量数据,在寻找合适位置进行插入时,目标页可能不在内存中,这就导致了大量的随机IO操作,影响插入效率。除此之外,大量的页分裂会导致大量的内存碎片。
注
- InnoDB表尽量自己指定主键,当表中同时有几个列都是唯一的,都可以作为主键时,要选择最常作为访问条件的列作为主键,提高查询的效率。
- InnoDB 表的普通索引都会保存主键的键值,所以主键要尽可能选择较短的数据类型,可以有效地减少索引的磁盘占用,提高索引的缓存效果
MyISAM 中的主键
- MyISAM 中允许没有主键的表存在