MySQL为什么需要一个主键
原创转自:http://www.jianshu.com/p/33b7b6e0a396
注意:创建表和创建主键是一个好习惯,或者应该作为规范使用。如果预测积累大量数据的可能性,必须设置主键并选择合适的主键,否则会产生严重影响count查询,insert,delete。以下为转载内容,收集参考。
主键
表中的每一行都应具有唯一标识自身的列(或一组列)。
客户可以使用客户编号列,而订单可以使用订单ID员工可以使用员工ID 或 员工社会保险号码。
主键(primary key) 一列(或一组列) 其值可以唯一区分表中的每一行。
唯一标识表中每一行的列(或列集)称为主键。 如果没有主键,更新或删除表中的特定行是很困难的,因为没有安全的方法可以确保仅设计相关行。
尽管并不总是需要主键,但大多数数据库设计应确保它们创建的每个表都有一个主键,以便将来进行数据操作和管理
表中任何列只要满足以下条件,都可以作为主键:
1没有两行具有相同的主键值
2每行必须有一个主键值(不允许主键列)NULL值)
主键值规范:此处列出的规则是MySQL自行执行。
主键的最佳习惯:
除MySQL除了强制性规则外,几个通常认为要遵守的最佳习惯是:
1不更新主键列的值
2不要重用主键列的值
3不要在主键列中使用可能会更改的值(例如,如果将名称用作标识供应商的主键,则在供应商合并并更改其名称时必须更改此主键)
简而言之,不应该使用有意义的column(id 不保存表本身 有意义的信息) 作为主键,表必须具有主键,为易于扩展、松散耦合和高可用性的系统奠定基础。
非常感谢 @pathbox、 @est、@hooooopo 同学提醒。主键的功能在于索引。
无特殊需求Innodb建议使用与业务无关的自我增强ID作为主键
InnoDB引擎使用聚簇索引,数据记录本身存储在主索引中(一个B+Tree)在叶节点上。这要求同一叶节点(大小为一个内存页或磁盘页)中的每个数据记录都按主键顺序存储,因此每当插入新记录时,MySQL如果页面达到加载因子(InnoDB默认为15/16), 打开新页面(节点)
1如果表使用自递增主键,则每次插入新记录时,这些记录将按顺序添加到当前索引节点的后续位置。当页面已满时,将自动打开一个新页面。如下图所示:
这将形成一个紧凑的索引结构,大致按顺序填充。 由于在每次插入期间不需要移动现有数据,因此效率很高,并且在维护索引时不会产生大量开销。
2、 如果使用非自增主键(如 ID 号或学生号),由于每个插入的主键的值近似随机,因此每条新记录都将插入到现有索引页的中间:
此时MySQL为了将新记录插入适当的位置,必须移动数据,甚至目标页也可能已写回磁盘并从缓存中清除。此时,需要从磁盘回读,这会增加很多开销。同时,频繁的移动和寻呼操作会导致大量的碎片化 我们得到了一个不够紧凑的索引结构,我们必须通过OPTIMIZE TABLE重建表格并优化填充页面。
在使用InnoDB存储引擎时,如果没有特殊需要,请始终使用与业务无关的自增字段作为主键。
mysql 频繁更新和删除可能会导致碎片。但是,具有较大片段的表的查询效率会降低。此时,有必要优化表以使查询更有效。
作者:清水大王
链接:http://www.jianshu.com/p/33b7b6e0a396
来源:简舒
版权归作者所有。商业转载请联系作者授权。非商业转载,请注明出处。
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除