在数据库中使用UUID+自增长ID混合方式,可以达到较好的安全性和查询效率。具体的实现方式如下:
在数据库表中创建两个字段,一个是 UUID 字段作为全局唯一主键,另一个是自增长的整型字段作为局部有序键。
例如:
sql:
CREATE TABLE `table_name` (
`uuid` CHAR(36) NOT NULL, -- UUID 全局唯一键
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT, -- 自增长局部有序键
... -- 其他字段
PRIMARY KEY (`uuid`),
UNIQUE KEY `idx_id` (`id`)
)
在应用程序端生成 UUID 作为新记录的全局主键。有多种算法可以生成 UUID,比如基于时间戳、随机数、哈希等。
将生成的 UUID 和自增长 ID 一起插入数据库。自增长 ID 可以由数据库自动维护。
uuid = generate_uuid()
insert_record(uuid, null, other_values)
对于需要全局唯一性和数据分片的查询,使用 UUID 作为条件查询。对于需要有序性和分页的查询,使用自增长 ID 作为条件。
sql:
-- 根据 UUID 进行全局唯一查询
SELECT * FROM table_name WHERE uuid = '550e8400-e29b-41d4-a716-446655440000';
-- 根据自增长 ID 进行有序、分页查询
SELECT * FROM table_name ORDER BY id LIMIT 100, 20;
这种混合方式的优点是:
- 利用 UUID 保证了全局唯一性和数据分布,适合分布式场景
- 使用自增长 ID 来提高查询效率,符合有序分页的需求
- 主键设计合理,同时考虑了安全性和查询性能
需要注意的是:
- 生成 UUID 会有一定的性能开销,但相对数据库的读写开销来说可以接受
- 自增长 ID 只保证单个节点内的有序性,多节点部署时需要分库分表
- 主键总长度会比单一使用 UUID 或自增长 ID 更长,会稍微增加索引存储
通过这种方式,可以根据不同的业务场景来使用合适的键,较好地平衡了安全性、唯一性、有序性和查询效率。