mysql为什么不推荐uuid做主键?

3 阅读3分钟

在MySQL中,不推荐使用UUID作为主键的主要原因还是性能问题,其次是可读性差和浪费存储空间。

  1. 性能问题:UUID 是128位的字符串,通常被表示为32个字符的十六进制数。相比自增的整数(如 AUTO_INCREMENT),UUID 更大,占用的存储空间也更多,这会增加索引大小,导致查询变慢,尤其是在大表中。

  2. 无序性:UUID 是无序的,这意味着每次插入新数据时,索引树需要频繁调整和重建。在 B-tree 索引结构中,自增的整数可以保证数据是顺序插入的,从而提高插入效率和减少碎片化,而 UUID 则会导致更多的页面拆分和索引重组,影响性能。

  3. 可读性差:UUID 由一串看似随机的字符组成,难以在人类可读性方面进行快速识别和调试。而自增整数更直观,方便开发人员理解和操作。

  4. 存储空间浪费:UUID 占用更多的存储空间,例如使用 CHAR(36) 或 BINARY(16) 存储 UUID,相比于 BIGINT 类型的自增 ID,这会占用更多的磁盘空间,并导致更高的内存和I/O开销。

一般主键推荐用什么?

在MySQL中,推荐使用以下几种方式作为主键,具体选择取决于应用场景:

主键自增整数(AUTO_INCREMENT)全局唯一ID(如雪花算法Snowflake ID)组合主键UUID(适用于特定场景)
使用场景这是最常见的选择,适用于单数据库或单表中需要唯一标识每一行数据的情况。适用于分布式系统中需要生成全局唯一ID的情况。当一张表中没有一个字段能够唯一标识记录时,可以使用多个字段的组合来构成主键。例如在多对多关系的连接表中,常用外键组合作为主键。尽管不推荐在大多数情况下使用UUID作为主键,但在需要保证跨数据库唯一性、无中心化ID生成的场景下,UUID仍然是一个有效的选择。
优势插入顺序性:自增的整数保证了数据在表中按顺序插入,有利于索引的维护和性能优化。 存储效率高:整数类型(如 INT 或 BIGINT)占用的存储空间少,索引效率高。简单易用:设置方便,适合大多数应用场景。全局唯一性:生成的ID在整个系统中都是唯一的,避免了跨数据库的冲突。可排序:如雪花算法生成的ID是基于时间的,可以保持一定的顺序性,有利于索引性能。避免创建额外的唯一ID列:直接利用现有的字段来定义唯一性。生成过程不依赖数据库,适合分布式环境。
缺点比单纯的自增ID稍复杂,且生成ID的服务可能成为瓶颈。组合主键的字段较多时,索引可能会变大,影响查询性能。如前所述,UUID较大、无序,性能较差。

总结

对于大多数应用,推荐使用自增整数(AUTO_INCREMENT)作为主键,因为它在性能、存储效率和易用性方面都表现优异。

在分布式系统或需要全局唯一ID时,可以考虑使用雪花算法或其他全局唯一ID生成方案;在特定关系型场景中,组合主键也是一个选择。

转载自开思通智网:w3.opensnn.com/os/article/…