在分布式系统中,生成全局唯一的ID是一个经典难题。自增ID在单库单表很好用,但一旦分库分表,就会产生冲突。UUID是解决方案之一,但它也有缺点。本文将深入分析UUID的优缺点,并介绍其他分布式ID方案。
一、UUID的优点和缺点
UUID的优点很明显:本地生成,无需网络调用;全球唯一,不会冲突;生成速度快。但缺点也很突出:存储空间大,128位,是自增ID的4倍;作为主键时,无序性导致数据库索引性能下降,每次插入都可能引起B+树页分裂;可读性差,一串32位十六进制数,不直观。
二、UUID vs 雪花算法
雪花算法(Snowflake)是Twitter开源的分布式ID生成方案。它生成的ID是64位整数,由时间戳、机器ID、序列号组成。优点是趋势递增,对数据库索引友好;存储空间小(8字节);可读性好(十进制数字)。缺点是需要依赖机器时钟,如果时钟回拨可能产生重复ID;需要维护机器ID分配。
三、UUID的最佳实践:数据库中的存储优化
如果你决定使用UUID作为数据库主键,可以通过一些优化减少性能问题。将UUID转换成16字节的二进制格式存储(MySQL的BINARY(16)),比存储字符串(36字节)节省空间。在应用层生成时,可以使用UUID v1(基于时间戳)代替v4(随机),使ID趋势递增,改善索引性能。
四、何时不应该使用UUID?
如果你的系统是单库单表,且没有数据合并需求,自增ID更简单高效。如果对ID有排序需求,比如订单号需要按时间排序,UUID v4的随机性不适用。如果ID需要暴露给用户,UUID太长不友好,可以考虑用短ID或混淆后的自增ID。
五、使用一页共享生成测试UUID
打开一页共享的UUID生成器,可以批量生成UUID v4,用于测试和开发。支持一次生成1到100个,一键复制。你可以用这些UUID填充测试数据库,评估索引性能。

