Laravel ObjectId 性能最强体积最小的分布式 UUID 生成扩展
相信每位 Laravel 开发者都遇到过这种情况:新建项目、写迁移、模型默认用自增 ID。开始挺好,但等到系统要上分布式、对接 API、搞微服务的时候,整数 ID 的局限性就暴露出来了。
Laravel ObjectId 就是为了解决这个问题:一套开箱即用的全局唯一 ID 方案,借鉴了 MongoDB ObjectId 的设计思路,可以直接用在 MySQL、MariaDB 和 PostgreSQL 上,不需要装 MongoDB。
原文链接 Laravel ObjectId 性能最强体积最小的分布式 UUID 生成扩展
为什么要用 ObjectId?
和 UUID、ULID 比起来,ObjectId 只有 12 字节,里面包含了时间戳、随机值和计数器,所以天然可排序、体积小、跨系统唯一。
性能数据很直观:生成速度是 UUID 的 3 倍,占用空间更小,直接拉升数据库性能和索引效率。
- 原生支持 MySQL、MariaDB 和 PostgreSQL
- 不依赖 MongoDB 驱动或扩展
ObjectId 内部结构
ObjectId 是个 12 字节(96 位)的标识符,分成四个部分:
| 组成部分 | 占用空间 | 说明 |
|---|---|---|
| 时间戳 | 4 字节 | UNIX 时间戳秒数,保证 ID 按时间排序 |
| 机器标识 | 5 字节 | 随机生成,每台机器不同 |
| 进程 ID | 2 字节 | 标识当前进程 |
| 自增计数器 | 3 字节 | 每个进程独立计数,初始值随机 |
总共:4 + 5 + 2 + 3 = 12 字节 = 24 位十六进制字符
这个设计的好处是不需要中心化的 ID 生成服务就能保证唯一性,还能按时间顺序排列,特别适合分布式系统。
扩展阅读:
相关包
这个 Laravel 扩展包依赖了一个核心 PHP 库:
- wooserv/php-objectid:纯 PHP 实现,不依赖任何扩展
- wooserv/laravel-objectid:Laravel 集成包,支持自动 ID 分配和迁移宏
两个包都是开源的,MIT 协议,WooServ Labs 出品。
安装
bash
composer require wooserv/laravel-objectid
使用方式
在模型中使用
php
use WooServ\LaravelObjectId\Concerns\HasObjectIds;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasObjectIds;
}
迁移文件写法
php
Schema::create('posts', function (Blueprint $table) {
$table->objectId(); // Creates a 24-char string primary key
$table->string('title');
$table->timestamps();
});
手动生成 ID
php
$id = objectid(); // e.g. 6730b6a0d8a28f890b7c9f40
性能测试
ID 生成速度(10,000 次)
----------------------------------------------------------
ObjectId : 0.412 µs per ID
objectid() helper : 0.417 µs per ID
UUID : 1.283 µs per ID
ULID : 1.147 µs per ID
----------------------------------------------------------
结论:ObjectId 最快
数据库插入速度(1,000 条)
----------------------------------------------------------
ObjectId : 14.78 ms total (0.015 ms/insert)
UUID : 15.48 ms total (0.015 ms/insert)
ULID : 15.17 ms total (0.015 ms/insert)
----------------------------------------------------------
三者对比
| 对比项 | ObjectId | UUID | ULID |
|---|---|---|---|
| 字符串长度 | 24 字符 | 36 字符 | 26 字符 |
| 字节数 | 12 | 16 | 16 |
| 时间排序 | 支持 | 不支持 | 支持 |
| 随机性 | 支持 | 支持 | 支持 |
| 可读性 | 简洁 | 冗长 | 适中 |
| 生成速度 | 最快 | 最慢 | 中等 |
| MySQL/MariaDB/PostgreSQL 支持 | 支持 | 支持 | 支持 |
| 是否需要 MongoDB | 不需要 | 不需要 | 不需要 |
总结: ObjectId 在体积、性能和时间排序上做到了最好的平衡,而且可以直接用在传统 SQL 数据库上。
核心优势
- 自动分配,不用手动生成 ID
- 迁移宏
$table->objectId()写起来很舒服 - 核心库独立,不绑定 Laravel 框架
- 体积小,比 UUID 省数据库空间
- 自带时间戳,ID 天然按时间排序
- 兼容主流数据库:MySQL、MariaDB、PostgreSQL
关于开源
这两个包都采用 MIT 协议,由 WooServ Labs 团队维护。这个团队专注于为现代 Web 应用打造开放、高性能的 PHP 工具。
我们对开源的理解:
- 安装要简单
- 使用要舒服
- 性能要给力
认同这些想法的话,欢迎给仓库点星、提交代码,或者推荐给其他开发者。