主键设计的原则:
1. 必定要显式定义主键
2. 采用与业务无关的单独列
3. 采用自增列
4. 数据类型采用int,并尽量小,能用tinyint就不用int,能用int就不用bigint
5. 将主键放在表的第一列性能
这样设计的缘由:
1. 在innodb引擎中只能有一个汇集索引,咱们知道,汇集索引的叶子节点上直接存有行数据,因此汇集索引列尽可能不要更改,而innodb表在有主键时会自动将主键设为汇集索引,若是不显式定义主键,会选第一个没有null值的惟一索引做为汇集索引,惟一索引涉及到的列内容不免被修改引起存储碎片且可能不是递增关系,存取效率低,因此最好显式定义主键且采用与业务无关的列以免修改;若是这个条件也不符合,就会自动添加一个不可见不可引用的6byte大小的rowid做为汇集索引spa
2. 需采用自增列来使数据顺序插入,新增数据顺序插入到当前索引的后面,符合叶子节点的分裂顺序,性能较高;若不用自增列,数据的插入近似于随机,插入时须要插入到如今索引页的某个中间位置,须要移动数据,形成大量的数据碎片,索引结构松散,性能不好
3. 在主键插入时,会判断是否有重复值,因此尽可能采用较小的数据类型,以减少比对长度提升性能,且能够减少存储需求,磁盘占用小,进而减小磁盘IO和内存占用;并且主键存储占用小,普通索引的占用也相应较小,减小占用,减小IO,且存储索引的页中能包含较多的数据,减小页的分裂,提升效率
4.将主键放在表的第一列好像是习惯,缘由我也不知道,试了下是能够放在其余列的......设计