问题

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。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐