0

0

如何解决Laravel中UUID存储效率低下问题,使用dyrynda/laravel-efficient-uuid提升数据库性能

花韻仙語

花韻仙語

发布时间:2025-11-23 11:52:22

|

974人浏览过

|

来源于php中文网

原创

如何解决laravel中uuid存储效率低下问题,使用dyrynda/laravel-efficient-uuid提升数据库性能

可以通过一下地址学习composer学习地址

告别 UUID 存储痛点:我的 Laravel 数据库优化之旅

最近在负责一个快速增长的 Laravel 项目,随着用户和数据量的激增,我们开始频繁收到数据库性能下降的告警。经过一番排查,我发现一个主要瓶颈竟然是那些我们引以为傲的 UUID!

我们知道,UUID(Universally Unique Identifier)在分布式系统和无主键场景下非常有用,能有效避免ID冲突。在 Laravel 中,我们通常会使用 uuid() 方法在迁移文件中创建 UUID 字段,并在模型中自动生成。然而,Laravel 默认会将 UUID 存储为 char(36) 类型的字符串。这意味着每个 UUID 都需要 36 个字符的存储空间,并且在创建索引和执行查询时,数据库需要处理更长的字符串,这无疑增加了额外的开销。

想象一下,当你的 posts 表有数百万条记录,每条记录都有一个 char(36)uuid 字段,并且你经常需要根据这个 uuid 进行查询和关联时,数据库的负担可想而知。我的困境是:既想享受 UUID 带来的便利,又不想牺牲数据库性能。手动将 UUID 转换为二进制存储固然可行,但那会增加大量重复且易错的代码,降低开发效率。

解决方案:dyrynda/laravel-efficient-uuid 登场!

正当我一筹莫展之际,我发现了 dyrynda/laravel-efficient-uuid 这个 Composer 包。它提供了一个优雅且高效的解决方案,通过将 UUID 存储为 binary(16) 类型,极大地优化了存储空间和查询性能,同时又保持了开发体验的流畅性。

那么,它是如何解决问题的呢?

这个包的核心思想是利用数据库的 binary(16) 类型来存储 UUID。一个标准的 UUID 实际上是一个 128 位的数字,将其存储为 binary(16) 只需要 16 个字节,相比 char(36) 的 36 个字节,足足节省了一半多的空间!更重要的是,数据库在处理二进制数据时效率更高,尤其是在索引和比较操作上。

dyrynda/laravel-efficient-uuid 通过扩展 Laravel 的数据库迁移语法和提供自定义模型类型转换器(Casts),实现了 UUID 在应用程序和数据库之间的无缝转换。

安装与配置:

首先,通过 Composer 安装这个包:

composer require dyrynda/laravel-efficient-uuid

由于这个包会对 MySQL schema 文件进行修改,它故意没有使用 Laravel 的包自动发现功能。你需要手动在 config/app.php 中注册其服务提供者:

// config/app.php
'providers' => [
    // ...
    Dyrynda\Database\LaravelEfficientUuidServiceProvider::class,
],

在迁移中使用高效 UUID:

现在,你可以在迁移文件中使用 efficientUuid() 方法来创建高效的 UUID 字段了。这个方法会自动创建 binary(16) 类型的字段。

陌言AI
陌言AI

陌言AI是一个一站式AI创作平台,支持在线AI写作,AI对话,AI绘画等功能

下载
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePostsTable extends Migration
{
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id(); // 或者 $table->increments('id');
            $table->efficientUuid('uuid')->unique(); // 使用 efficientUuid
            $table->string('title');
            $table->text('body');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

模型中的类型转换(Casting):

为了让 Laravel 模型能够正确地读写 binary(16) 字段,你需要为 UUID 字段添加一个自定义的类型转换器 EfficientUuid。同时,如果你希望模型自动生成 UUID,可以结合 dyrynda/laravel-model-uuid 包(与此包作者是同一人,且功能已合并)。

 EfficientUuid::class, // 使用 EfficientUuid cast
    ];

    // ... 其他模型代码
}

这样一来,你在模型中操作 uuid 属性时,它依然是一个可读的字符串 UUID,而底层数据库则高效地存储着二进制数据,所有转换都由 EfficientUuid 自动处理。

便捷的查询与验证:

这个包还提供了一些额外的便利功能:

  • 查询: 你可以直接使用 whereUuid() 作用域来通过字符串 UUID 查询记录,无需手动转换。

    $post = Post::whereUuid('25b112a9-499a-4627-9ea0-72cd8694aee3')->first();
  • 验证: 对于 UUID 字段的验证,你可以使用 EfficientUuidExists 规则。

    use Dyrynda\Database\Rules\EfficientUuidExists;
    
    public function update(Request $request, Post $post)
    {
        $request->validate([
            'uuid' => [new EfficientUuidExists(Post::class)],
            // 或指定自定义列名
            // 'custom_uuid' => [new EfficientUuidExists(Post::class, 'custom_uuid')],
        ]);
        // ...
    }

总结其优势和实际应用效果

通过引入 dyrynda/laravel-efficient-uuid,我的项目获得了显著的提升:

  1. 大幅节省存储空间: UUID 从 char(36) 变为 binary(16),数据库文件体积明显减小,尤其是在大型表中。
  2. 显著提升查询性能: 数据库在处理和索引二进制数据时效率更高,查询速度得到优化,特别是那些涉及 UUID 字段的 WHERE 子句和 JOIN 操作。
  3. 无缝的开发体验: 开发者无需关心 UUID 的二进制转换细节,在代码中依然以字符串形式操作 UUID,保持了 Laravel 优雅的开发风格。
  4. 易于集成: 仅需几步 Composer 安装和配置,即可轻松集成到现有或新项目中。

如果你也在 Laravel 项目中大量使用 UUID,并且正为数据库性能担忧,那么 dyrynda/laravel-efficient-uuid 绝对值得一试。它不仅能解决你的燃眉之急,还能为你的应用带来长远的性能效益。

Treeware 倡议:

值得一提的是,dyrynda/laravel-efficient-uuid 的作者推行 Treeware 理念:如果你在生产环境中使用这个包并从中受益,鼓励你为世界购买一棵树。这是一个非常有意义的倡议,让我们在享受开源便利的同时,也为环境保护贡献一份力量。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2747

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1676

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1535

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

995

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1464

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1235

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1549

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1307

2023.11.13

html编辑相关教程合集
html编辑相关教程合集

本专题整合了html编辑相关教程合集,阅读专题下面的文章了解更多详细内容。

16

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
第二十四期_PHP8编程
第二十四期_PHP8编程

共86课时 | 3.4万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 2.4万人学习

第二十三期_PHP编程
第二十三期_PHP编程

共93课时 | 6.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号