Laravel Eloquent 与 DB facade:为什么使用 Eloquent 并降低性能?

Laravel Eloquent vs DB facade: Why use Eloquent and decrease performance?

我在 Laravel's DB facade query builder and Laravel's Eloquent ORM 之间做了一些性能测试。对于许多 SQL 语句(SELECT、UPDATE、DELETE、INSERT),DB facade 比 Eloquent 快得多。

那么为什么有人会使用较慢的 Laravel Eloquent 而不是较快的 DB facade?

这只是我的看法,不是一个全面的答案。在给定的情况下,我会使用更方便的任何东西。

如果我遇到用 eloquent 或查询生成器编写的包或代码,我会使用正在使用的任何东西。

我发现如果我从头开始创建一些东西,查询构建器会更直观,所以我会更频繁地使用它。

当谈到 Laravel 时,开发应用程序的便利性和速度似乎比性能更重要。我真的很喜欢他们让一切变得非常简单,即使对于那些对 php/mysql 知之甚少的人来说也是如此。在某些情况下 eloquent 比查询生成器更容易。在其他情况下反之亦然。我认为有很多方法可以让 Laravel 变得如此简单和新手友好。

为什么使用 Laravel Eloquent 而不是 DB facade:

  1. 您可以编写面向对象的代码。

  2. 它比写原始 SQL 或使用 DB facade 更容易使用。

  3. 没有绑定到 table 架构,因此例如,如果您想更改 table 名称,您不必触摸单个 Eloquent查询,只需更改Eloquent模型中的table名称即可。

  4. table 之间的关系可以以优雅的方式维护。只需提及关系类型(JOINLEFT JOINRIGHT JOIN 等)即可从相关 table 中获取数据。

  5. Eloquent 查询比原始 SQL 或数据库外观更具可读性。

  6. 您可以在模型内部使用方法、范围、访问器、修饰符等,这是一种可维护的模式。

Eloquent 是 Laravel 对 Active Record 模式的实现,它具有所有优点和缺点。

Active Record 是一种以 CRUD 方式处理单个实体的良好解决方案 - 即,创建一个具有填充属性的新实体,然后将其保存到数据库,从数据库加载记录,或删除。

您将从 Eloquent 的功能中获益良多,例如脏检查(仅针对已更改的字段发送 SQL 更新)、模型事件(例如发送管理警报)或在有人创建新帐户时更新统计计数器)、特征(时间戳、软删除、您的自定义特征)eager/lazy 加载等。您还可以应用域驱动模式并在您的 Active 中实现一些业务逻辑记录实体,例如验证、管理关系、计算等

但是,如您所知,Active Record 会带来一些性能代价。

当您处理单个记录或几条记录时,没有什么可担心的。但对于读取大量记录(例如数据网格、报告、批处理等)的情况,普通 Laravel DB 方法是更好的方法。

对于我们基于 Laravel 的应用程序,我们正在使用我们认为合适的两种方法。我们使用 Laravel 的 Eloquent for UI 表单来处理单个记录并使用 DB 方法(由 SQL 视图提供支持,并进行了额外的数据库引擎特定性能调整) 检索 UI 表的数据、导出任务等。它也适用于 RESTful API - Eloquent 用于 GET、PUT、POST、使用键删除和 DB 用于没有密钥但有过滤器、排序和分页的 GET。

我喜欢在从数据库构建复杂查询时使用查询生成器,因为它看起来很容易使用。对于使用单个 table,我喜欢 eloquent。

是的,在某些情况下你是对的。

当您处理更多数据时,最好使用 Laravel 的 DB facade query builder 而不是 Laravel 的 Eloquent ORM。

根据性能测试,在一个简单的 table 中插入 1000 行需要 Eloquent 1.2 秒,而数据库外观只需要 800 毫秒。

那么为什么要使用 Eloquent 呢? Eloquent 也很重要,因为:

  • 它的语法比 DB facade 更简单。

  • 不懂的开发者更容易SQL。您需要了解 SQL 才能使用 DB facade。

  • 使用 Eloquent 编写的代码比使用 DB facade 编写的代码更具可读性,因此更易于维护:

    // With Eloquent
    $student = App\Student::find($id);
    
    // With the DB facade
    $student = DB::table('student')->where('id', $id)->first();
    
  • 如果您想更改数据库,使用 Laravel Eloquent 会更容易,因为它可以处理许多不同的数据库,而 DB facade 需要您编写 SQL 可能需要为不同的数据库重写。

因此,当您在具有简单 CRUD 操作的小型站点上工作时,请使用 Eloquent,而当您使用 Eloquent 不支持的许多连接和其他功能时,请使用 DB facade。

现实生活中的例子:

  1. 您正在制作一个大学网站,其中包含 5,000 名教师和 10,000 名学生,以及一些通知和文件。最好用 Laravel Eloquent 来构建这个站点,因为它简单易读。

  2. 您正在制作像 Stack Overflow 这样的高流量网站,该网站每月为超过 1 亿人提供服务,并且有超过 7000 万个帖子。最好使用 DB facade,因为它更快并且会导致响应时间显着加快。

您可以使用 Laravel Debugbar 检查您的查询性能。

Here是Eloquent和DB facade的性能、内存消耗和代码质量的全面比较。

当涉及到性能和应用程序增长时,为了进行比较,请查看下表:

Eloquent ORM 平均响应时间:

Joins Average (ms)
1 162.2
3 1002.7
4 1540.0

原始 SQL 平均响应时间:

Joins Average (ms)
1 116.4
3 130.6
4 155.2

Article Reference

Eloquent ORM 最适合在特定 table 中处理较少的数据。另一方面,查询构建器处理大量数据所需的时间比 Eloquent ORM 快一个或多个 tables。

就我而言,我在包含少于 17500 个条目的 table 应用程序中使用 ELoquent ORM。每当我预计 table 将包含超过 17500 个条目时,查询构建器是最好的。

此外,在带有子查询的应用程序中,我更喜欢查询构建器而不是 ELoquent ORM。

它们之间有很多不同

  1. 构建器查询比您通过调试器测试的 ORM 快得多。 这是测试 https://scotch.io/tutorials/debugging-queries-in-laravel.
  2. 的方法
  3. 当您处理大量数据时,生成器查询的执行时间更短 如果您的数据库中有比 ORM 多 1,00,000。
  4. Builder query is best suitable for large amount data.Orm is best suitable when you 使用关系,因为它提供了许多关系方法 定义 tables.
  5. 之间的关系
  6. Builder 查询使用 sql 的连接,但 orm 使用关系来工作 2 tables 或更多 table.