问题描述
我有一个 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 流程和数据仓库。也许你应该考虑这样的事情!
,我建议使用缓存服务器,例如Redis 或Memcache 并存储缓存的结果,而不是每次都计算它们。
喜欢:
$totalDownload = Cache::remember('total_download',60*60 /*$seconds*/,function () {
return Lot::sum('count');
});