MySQL中是否必须要有主键mysql一定要主键吗

等等,昨天我在调试电商后端系统时发生了一些奇怪的事情。
用户表没有设置主键,数百条订单数据无法进行相关查询。
数据量不大,只有两三千条,但是每个JOIN都贴成了PPT。
开发者表示,一开始没有添加它是为了省事,但后来发现它完全无法使用。
我盯着那个id字段为空的表,突然想到如果我早点设置自动升级主键的话,查找速度可能会更快。
现在想想,虽然MySQL并不严格需要主键,但是没有主键确实很不方便。

MySQL InnoDB数据表缺少主键会怎样

我们来详细谈谈这个问题。
你说的是MySQL InnoDB,对吧?那张数据表,如果没有主键,肯定会受到影响。

例如,考虑聚集索引。
InnoDB使用B+树结构。
数据本身位于主键索引中,这是一个嵌套索引。
如果你的表没有定义主键,InnoDB 会发生什么?
首先,看起来您首先指定了主键。
如果指定了主键,那么它会使用主键作为聚簇索引。
其次,如果不指定主键,则第一个会获取非空唯一索引,该索引为空且非唯一。
它找到这个并将其用作簇索引。
第三,如果没有主键或合适的非空唯一索引怎么办?它创建自己的不可见列,称为 ROW_ID。
然后它创建一个名为 GEN_CLUUST_INDEX 的聚集索引。
这个ROW_ID是一个6 字节的自增值,这意味着当输入一块数据时它会自动递增。

我们来谈谈性能。
如果你的表没有主键,查询性能肯定会变慢。
为什么?因为它需要全表扫描。
例如,2 02 2 年你可能在上海这样的某个城市,你的表可能有数十万条记录。
如果你没有主密钥,验证一些数据,就需要重新扫描,速度肯定会比较慢。
如果您有数百万条记录,这将很容易,您可能无法在几分钟内看到它们。
插入性能也会受到影响。
那ROW_ID应该是自己加的,这个自增应该使用全局顺序。
例如,在高卷积插入期间,您可能必须一次插入 1 00 个线程。
ROW_ID 必须被锁定,以防止其重复,从而导致锁争用并影响插入性能。

另一个例子是同时提交的锁竞争。
该 ROW_ID 是全局共享的。
弯头应锁定,以确保高转换插入时的安全。
这会导致锁争用并影响插入性能。
试想一下,如果你在2 02 3 年的北京,你的系统有1 000个连续查询,输入所有数据,锁竞争肯定会很艰难,输入性能肯定会受到影响。

所以要为每个表准备主键受到推崇的。
为什么?要提高查询和插入性能,请删除锁参数。
您可以选择合适的替换主键,例如自增ID或UUID,但建议使用自增ID以获得更好的性能。

总之,了解InnoDB的数据结构,尤其是聚集索引,对于设计高效的数据库表至关重要。
主键在InnoDB表中起着核心作用,不仅影响数据的存储方式,还影响查询和插入性能。
因此,建表时应充分考虑主键的重要性,为每个表设置合适的主键。
这不仅是为了提高性能,也是一种良好的数据库设计实践。