MySQL InnoDB数据表不设置主键时的情况

问题

MySQL数据库规范中规定每张表中都需要设置主键,那么是因为什么原因而如此规定的呢。每一条规范都会有它背后的涵义。

InnoDB

InnoDB是MySQL数据库的默认引擎,我们需要了解它的一个重要概念:聚簇索引。InnoDB按照每张表的主键构造一棵B+树,主键对应的索引就是聚簇索引,在每个叶子节点存放着数据表的行数据。所以主键对于InnoDB来说至关重要。

InnoDB对聚簇索引的处理

1、第一种情况:用户定义了主键,那么InnoDB会使用主键作为聚簇索引;
2、第二种情况:用户没有定义主键,那么InnoDB会使用第一个非空的唯一索引作为聚簇索引;
3、第三种情况:用户既没有定义主键,也没有定义唯一索引,那么InnoDB会自动生成一个不可见的ROW_ID的列名为GEN_CLUST_INDEX的聚簇索引,该列是一个6字节的自增数值,随着插入而自增。

影响

很明显,缺少主键的表,InnoDB会内置一列用于聚簇索引来组织数据。而没有建立主键的话就没法通过主键来进行索引,查询的时候都是全表扫描,小数据量没问题,大数据量就会出现性能问题。

而且不设置主键不单单影响到查询,在进行写操作的时候,由于ROW_ID是共享的,这意味着插入的时候需要共享该序列,那么高并发插入的时候为了保持唯一性就避免不了锁的竞争,进而影响性能。

总结

由以上分析可以推论,在建表的时候无论如何都要设置主键,如何没有可用作主键的字段,可以设计一个业务无关的字段,比如xx_id。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值