【发布时间】:2021-05-01 17:49:13
【问题描述】:
我有一个 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 的系统。
【问题讨论】:
-
对 InnoDB 表的 COUNT() 操作是一个已知的弱点。它必须访问每一行才能计数,这意味着无法优化此类查询。优化的方法是维护一个包含当前计数的汇总表。
-
您在
checked列上有索引吗?无论如何,从Mysql改为NoSQL可能会更好。 -
如果您很少更改
checked值,您还可以考虑将表格分成两部分,例如unchecked_serials和checked_serials因为(大概)计算表中的所有内容比使用过滤器计算要快 -
这个问题对你有帮助:dba.stackexchange.com/questions/188667/…