Laravel ObjectId 性能最强体积最小的分布式 UUID 生成扩展

相信每位 Laravel 开发者都遇到过这种情况:新建项目、写迁移、模型默认用自增 ID。开始挺好,但等到系统要上分布式、对接 API、搞微服务的时候,整数 ID 的局限性就暴露出来了。

Laravel ObjectId 就是为了解决这个问题:一套开箱即用的全局唯一 ID 方案,借鉴了 MongoDB ObjectId 的设计思路,可以直接用在 MySQL、MariaDB 和 PostgreSQL 上,不需要装 MongoDB。

为什么要用 ObjectId?

和 UUID、ULID 比起来,ObjectId 只有 12 字节,里面包含了时间戳、随机值和计数器,所以天然可排序、体积小、跨系统唯一。

性能数据很直观:生成速度是 UUID 的 3 倍,占用空间更小,直接拉升数据库性能和索引效率。

  • 原生支持 MySQL、MariaDB 和 PostgreSQL
  • 不依赖 MongoDB 驱动或扩展

ObjectId 内部结构

ObjectId 是个 12 字节(96 位)的标识符,分成四个部分:

组成部分占用空间说明
时间戳4 字节UNIX 时间戳秒数,保证 ID 按时间排序
机器标识5 字节随机生成,每台机器不同
进程 ID2 字节标识当前进程
自增计数器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)
----------------------------------------------------------

三者对比

对比项ObjectIdUUIDULID
字符串长度24 字符36 字符26 字符
字节数121616
时间排序支持不支持支持
随机性支持支持支持
可读性简洁冗长适中
生成速度最快最慢中等
MySQL/MariaDB/PostgreSQL 支持支持支持支持
是否需要 MongoDB不需要不需要不需要

总结: ObjectId 在体积、性能和时间排序上做到了最好的平衡,而且可以直接用在传统 SQL 数据库上。

核心优势

  • 自动分配,不用手动生成 ID
  • 迁移宏 $table->objectId() 写起来很舒服
  • 核心库独立,不绑定 Laravel 框架
  • 体积小,比 UUID 省数据库空间
  • 自带时间戳,ID 天然按时间排序
  • 兼容主流数据库:MySQL、MariaDB、PostgreSQL

关于开源

这两个包都采用 MIT 协议,由 WooServ Labs 团队维护。这个团队专注于为现代 Web 应用打造开放、高性能的 PHP 工具。

我们对开源的理解:

  • 安装要简单
  • 使用要舒服
  • 性能要给力

认同这些想法的话,欢迎给仓库点星、提交代码,或者推荐给其他开发者。

相关链接

本作品采用《CC 协议》,转载必须注明作者和本文链接