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:
您可以编写面向对象的代码。
它比写原始 SQL 或使用 DB facade 更容易使用。
没有绑定到 table 架构,因此例如,如果您想更改 table 名称,您不必触摸单个 Eloquent查询,只需更改Eloquent模型中的table名称即可。
table 之间的关系可以以优雅的方式维护。只需提及关系类型(JOIN
、LEFT JOIN
、RIGHT JOIN
等)即可从相关 table 中获取数据。
Eloquent 查询比原始 SQL 或数据库外观更具可读性。
您可以在模型内部使用方法、范围、访问器、修饰符等,这是一种可维护的模式。
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。
现实生活中的例子:
您正在制作一个大学网站,其中包含 5,000 名教师和 10,000 名学生,以及一些通知和文件。最好用 Laravel Eloquent 来构建这个站点,因为它简单易读。
您正在制作像 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
Eloquent ORM 最适合在特定 table 中处理较少的数据。另一方面,查询构建器处理大量数据所需的时间比 Eloquent ORM 快一个或多个 tables。
就我而言,我在包含少于 17500 个条目的 table 应用程序中使用 ELoquent ORM。每当我预计 table 将包含超过 17500 个条目时,查询构建器是最好的。
此外,在带有子查询的应用程序中,我更喜欢查询构建器而不是 ELoquent ORM。
它们之间有很多不同
- 构建器查询比您通过调试器测试的 ORM 快得多。
这是测试 https://scotch.io/tutorials/debugging-queries-in-laravel.
的方法
- 当您处理大量数据时,生成器查询的执行时间更短
如果您的数据库中有比 ORM 多 1,00,000。
- Builder query is best suitable for large amount data.Orm is best suitable when you
使用关系,因为它提供了许多关系方法
定义 tables.
之间的关系
- Builder 查询使用 sql 的连接,但 orm 使用关系来工作 2 tables 或更多 table.
我在 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:
您可以编写面向对象的代码。
它比写原始 SQL 或使用 DB facade 更容易使用。
没有绑定到 table 架构,因此例如,如果您想更改 table 名称,您不必触摸单个 Eloquent查询,只需更改Eloquent模型中的table名称即可。
table 之间的关系可以以优雅的方式维护。只需提及关系类型(
JOIN
、LEFT JOIN
、RIGHT JOIN
等)即可从相关 table 中获取数据。Eloquent 查询比原始 SQL 或数据库外观更具可读性。
您可以在模型内部使用方法、范围、访问器、修饰符等,这是一种可维护的模式。
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。
现实生活中的例子:
您正在制作一个大学网站,其中包含 5,000 名教师和 10,000 名学生,以及一些通知和文件。最好用 Laravel Eloquent 来构建这个站点,因为它简单易读。
您正在制作像 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 |
Eloquent ORM 最适合在特定 table 中处理较少的数据。另一方面,查询构建器处理大量数据所需的时间比 Eloquent ORM 快一个或多个 tables。
就我而言,我在包含少于 17500 个条目的 table 应用程序中使用 ELoquent ORM。每当我预计 table 将包含超过 17500 个条目时,查询构建器是最好的。
此外,在带有子查询的应用程序中,我更喜欢查询构建器而不是 ELoquent ORM。
它们之间有很多不同
- 构建器查询比您通过调试器测试的 ORM 快得多。 这是测试 https://scotch.io/tutorials/debugging-queries-in-laravel. 的方法
- 当您处理大量数据时,生成器查询的执行时间更短 如果您的数据库中有比 ORM 多 1,00,000。
- Builder query is best suitable for large amount data.Orm is best suitable when you 使用关系,因为它提供了许多关系方法 定义 tables. 之间的关系
- Builder 查询使用 sql 的连接,但 orm 使用关系来工作 2 tables 或更多 table.