使用 Datatables 在 Laravel 中处理大量行的最佳方法是啥?

Posted

技术标签:

【中文标题】使用 Datatables 在 Laravel 中处理大量行的最佳方法是啥?【英文标题】:What is the best approach to process a huge amount of rows in Laravel using Datatables?使用 Datatables 在 Laravel 中处理大量行的最佳方法是什么? 【发布时间】:2019-03-13 16:21:03 【问题描述】:

我在显示超过 3000 行时遇到问题(这个数字将以指数速度增加)。

    我目前正在从 mysql 数据库返回集合中的数据。我应该使用 Laravel Eloquent 还是 Query Builder 以获得更好的控制器性能?

    我是否应该以 JSON 文件格式返回数据,这是否有助于加快处理速度?

    有没有一种方法可以添加、删除、编辑数据表中的行,而无需每次都实际返回视图?

如果您可以通过一些可能有帮助的文章提供解释,那就太好了。我试图找到一些东西让我走上处理大量数据的最佳路径,但没有运气。

问候, 詹姆斯

【问题讨论】:

您永远不需要显示超过 100-200 行(甚至 500 行可能太多了)。始终使用分页。使用索引进行快速搜索和分页显示。您应该始终通过请求传递页码(无论是 AJAX 还是经典的 HTTP POST 重定向获取 GET 值)。这适用于在屏幕上显示数据,因为方法就是这样 - 您永远不需要在屏幕上看到超过 200 个结果。 【参考方案1】:

对于处理大数据,总是首选chunk 或paginate 它,您可能需要检查this answer。

我应该使用 Laravel Eloquent 还是 Query Builder 以获得更好的控制器性能

Eloquent 使用活动记录模式更容易用于简单查询和阅读模型,因为它使用活动记录模式,而 builder 处理查询和复杂性的速度更快,您可能需要查看this answer

我应该以 JSON 文件格式返回数据,这是否有助于加快处理速度?

json 或集合,两者都由 Laravel 处理,恕我直言,不会有太大区别,但是如果您正在考虑将一些 DB 记录保存在缓冲区 json 文件中:

让我们考虑一下这些场景(虽然数据库总是很大),

    您的数据库中的事务很少甚至没有,将其保存在 Json 文件中会加快处理速度,同时牢记安全措施。 您的数据库中有最小到中等的事务,json 不会那么有用。 您有大量事务,最好开始考虑 mongodb 或您喜欢的 NoSQL DB。

有没有一种方法可以添加、删除、编辑数据表中的行,而无需每次都实际返回视图?

添加或删除或更新可以以单一或批量方式完成,关于您的第三个问题,是的,您可以创建控制器功能并通过 ajax 进行通信。

过程是:创建一个controller函数查询数据库,为这个函数创建一个路由,在前端通过ajax这个函数查询这个函数,可以查看this tutorial。

【讨论】:

【参考方案2】:

当您将所有这些数据提取到后端时,我建议不要对 Eloquent 模型进行水合。 Eloquent 模型相当沉重。相反,您可以使用轻量级标准类:

$users = DB::table('users')->get();

get 方法返回一个包含结果的 Illuminate\Support\Collection,其中每个结果都是 php stdClass 对象的一个​​实例。

https://laravel.com/docs/5.7/queries#retrieving-results

除此之外,您真的应该考虑对结果进行分页。获取、转换和呈现大量项目通常会导致糟糕的用户体验。

https://laravel.com/docs/5.7/pagination

当然,您可以(并且应该)告诉数据库尽可能多地完成繁重的工作。数据库旨在处理大量数据。

使用相同数据进行大规模更新: https://laravel.com/docs/5.7/queries#updates

批量插入: https://laravel.com/docs/5.7/queries#inserts

更灵活的批量更新/插入包: https://packalyst.com/packages/package/mavinoo/laravel-batch

另外,看看这个例子: updating table rows in postgres using subquery

这是您可以使用子查询中的数据更新表的方法。这是一个 Postgres 示例,可能不适合您的情况。只是想让您了解一下 DB 的能力。如果您对原始查询感到满意,您的数据库引擎可以为您提供性能最高、最灵活的工具。

【讨论】:

以上是关于使用 Datatables 在 Laravel 中处理大量行的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

DataTables 的引导程序未在 Laravel 中显示

如何将数据库索引与 Datatables 和 yajra/laravel-datatables 一起使用

Laravel 和 Datatables:Ajax 数据不使用来自 html 选择的新 ajax 参数刷新表

yajra/laravel-datatables 搜索不适用于 laravel 5.4

Laravel - Yajra Datatables 异常消息:试图获取非对象的属性

Laravel DataTables HTML生成器插件