1. 作用
- 从业务上来说
在设计数据库时不需要费尽心思去考虑设置哪个字段为主键。然后是这些字段只是理论上是唯一的,例如使用图书编号为主键,这个图书编号只是理论上来说是唯一的,但实践中可能会出现重复的 情况。所以还是设置一个与业务无关的自增ID作为主键,然后增加一个图书编号的唯一性约束。 - 从技术上来说
如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。 总的来说就是可以提高查询和插入的性能。 - 对InnoDB(数据存储引擎)来说
- 主键索引既存储索引值,又在叶子节点中存储行的数据,也就是说数据文件本身就是按照b+树方式存放数据的。
- 如果没有定义主键,则会使用非空的UNIQUE键做主键 ; 如果没有非空的UNIQUE键,则系统生成一个6字节的rowid做主键;
聚簇索引中,N行形成一个页(一页通常大小为16K)。如果碰到不规则数据插入时,为了保持B+树的平衡,会造成频繁的页分裂和页旋转,插入速度比较慢。所以聚簇索引的主键值应尽量是连续增长的值,而不是随机值(不要用随机字符串或UUID)。
故对于InnoDB的主键,尽量用整型,而且是递增的整型。这样在存储/查询上都是非常高效的。
2. 业务主键和非业务主键
- 自增字段作为主键(一般多用int类型定义),也称为非业务主键(逻辑主键或者代理主键)意思就是这列数据与业务无关,仅仅作为主键而设计,会浪费主键资源。
3. sqlserver修改主键为自增
- 先删除id字段, 执行下面sql即可:
alter table 表名 add id int IDENTITY (1,1) PRIMARY KEY
如果在navicat中需要移动id字段位置,可以将其他字段复制粘贴到id字段,再将id字段前的删除
4. 优缺点
自增主键 | 业务主键 | |
---|---|---|
优点 | 1. 索引所占空间小 2. 增删改查效率高 3.业务变化不需要更新主键 | 1. 保证业务逻辑的完整性 2. 安全性高 3.可以转移数据库 |
缺点 | 无法转移数据库 | 1. 效率低 2.业务变化需要修改主键 |
仅作个人笔记,参考博主
- https://www.cnblogs.com/lanqi/p/10185172.html
- https://blog.csdn.net/hao_0514
- 百度词条