代理主键(逻辑主键)
与业务无关的,无意义的数字序列,比如自动增长的ID。
最常用的生成方式有2种:自增和UUID
自然主键(业务主键)
事物属性中的自然唯一标识。本身具有一定的含义,是构成记录的组成部分,比如学生的学号,每个人的身份证号,电商系统中的订单号。
优缺点:
1、业务主键一般都是字符串,更浪费空间。
2、业务主键无序,写入时需更长时间组织索引。为了使主键有序,需要进行索引重排,无序的编号需要频繁进行索引重排,降低入库性能(数据移动),而代理主键本身自增,不需要进行索引重排。
3、业务主键如果是字符串,在分库分表时,无法直接取模运算,需要先转换数字,处理更耗时。
4、业务主键在分布式系统中存在高耦合问题,一旦数据本身发生变化,系统极难维护。例如,用户系统、积分系统、账户系统(管理余额),如果用户系统以身份证作为主键,在系统间操作的时候需要传入这个主键,但如果是一个老人,身份证15位,而现在国家要求身份证必须更改为18位,其他系统都需要进行相应的更新,极大的增加了数据维护成本,系统之间耦合度太高。
5、业务主键可能存在冲突。例如如果是以身份证为id,那么在一个员工表中,假设一个员工离职,后因为某种原因又入职,一般的业务处理都是重新创建一条员工记录,但身份证号相同,就会存在主键冲突的问题。
6、如果没有指定自增id 主键,那么该表的第一个唯一非空索引被作为聚集索引。如果这个列是 char 类型的数据,会增加表的插入开销。
7、如果没有指定自增 id,也没有唯一非空索引,那么mysql就会自动生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,这个列值也是自增的。
8、使用代理键可以带来性能上的优势。和自然关键字相比,代理关键字很小,是整型的,可以减小事实表中记录的长度。这样,同样的IO就可以读取更多的事实表记录。另外,整型字段作为外键连接的效率也很高。