用 Laravel 和 Mysql 处理 1 亿多条记录

问题描述

我有一个 Laravel 应用程序,在下面的一个serials 表上有大约 5200 万条记录。

Schema::create('serials',function (Blueprint $table) {
        $table->id();
        $table->bigInteger('pinNumber');
        $table->bigInteger('serialNumber');
        $table->boolean('checked')->default(0);
        $table->boolean('status')->default(0);
        $table->string('lotNumber')->nullable();
        $table->Integer('checkCode');
        $table->index(['serialNumber','pinNumber']);
        $table->softDeletes();
        $table->timestamps();
    });

我计划拥有大约 1 亿条记录,但网络速度非常慢,目前有 5200 万条记录。

我的插入(自动生成的连续剧)工作正常,但按以下方式获取计数比预期花费的时间更长。

    $totalSerials = Serial::max('id');
    $totalDownload = Lot::sum('count');
    $appovedCodes = Serial::where('checked',true)->count();

请建议使用 laravel 处理大数据的最佳方式。我有一个 8gb ram 和 160gb ssd 的系统。

解决方法

对于1 亿 数量级的海量数据以及不需要关系数据库的情况,

  • 推荐使用nosql DBMS,比如mogodb

  • 但是索引可以帮助数据库管理系统更快地获得查询结果。

  • 大多数情况下,您应该提高数据库性能,而不是依赖 Laravel。 如果日期间隔不接近,我建议您在 created_at 列上对表进行分区,比如说按月分区。这也有助于提高数据库的性能。

  • 另一个想法是,如果您不希望立即获得 Lot::sum('count')Serial::where('checked',true)->count() 等结果,请每晚将它们存储在单独的临时表中,并每晚更新其值。

不建议将最后一个想法用于操作数据库。它用于 BI 流程和数据仓库。也许你应该考虑这样的事情!

,

我建议使用缓存服务器,例如RedisMemcache 并存储缓存的结果,而不是每次都计算它们。

喜欢:

$totalDownload = Cache::remember('total_download',60*60 /*$seconds*/,function () {
    return Lot::sum('count');
});