【问题标题】:Handling 100 million + records with Laravel and Mysql使用 Laravel 和 Mysql 处理超过 1 亿条记录
【发布时间】: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_serialschecked_serials 因为(大概)计算表中的所有内容比使用过滤器计算要快
  • 这个问题对你有帮助:dba.stackexchange.com/questions/188667/…

标签: php mysql laravel bigdata


【解决方案1】:

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

  • 建议使用nosql DBMS,如mogodb

  • 索引可以帮助 dbms 获得更快的查询结果。

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

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

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

【讨论】:

    【解决方案2】:

    我建议使用 RedisMemcache 之类的 Cache Servers 并存储缓存的结果,而不是每次都计算它们。

    喜欢:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多