Laravel Eloquent 与 SelectRaw。它对查询性能有何影响?

问题描述 投票:0回答:1

当我们使用 Eloquent 与 SelectRaw 来处理如下场景时,Laravel 如何处理查询:

这样获取数据会更快吗:

$data = Records::where('active', 1)->get();

或者这会更快地获取我的数据吗:

$data = DB::select( DB::raw("SELECT * from records WHERE active ='1'") ); 

当我们处理5,00,000条左右的大数据时,使用SelectRaw会影响查询处理速度吗?

php laravel laravel-5 eloquent
1个回答
4
投票

使用任何 ORM 总会产生一些开销。然而,这几乎总是不是问题。

例如,虽然编写原始 SQL 可能会稍微提高性能,但与最初进行查询的成本相比,它通常相形见绌。与在原始 SQL 中重写 ORM 查询相比,通过缓存响应可以获得更大的性能提升。

ORM 确实会使某些类型的缓慢低效查询更有可能发生,但这可以通过使用像 Clockwork 这样的分析器来识别缓慢或不必要的查询并将其重构来解决。大多数 ORM 都有工具来处理诸如“N+1 问题”之类的事情 - 例如,Eloquent 有 with() 方法来急切加载相关表,这通常比显式编写查询来执行急切操作要方便得多正在为您加载。

使用 ORM 还可以为开发人员带来显着的好处:

通常更容易表达表之间的关系
  • 它有助于避免 PHP 和 SQL 之间的心理上下文切换
  • 它为您完成了大量清理数据的工作
  • 它有助于使您的应用程序在不同数据库之间可移植(例如,您可以使用 SQLite 进行测试,但在生产中使用 MySQL)
  • 如果您的逻辑无法使用 ORM 表达,通常很容易为该部分编写原始 SQL
  • ORM 模型比数组类型安全得多
  • 如果您在 Web 应用程序中的查询速度很慢,那么将其重写为原始查询可能是您应该考虑做的最后一件事,之后:

重构一个或多个查询以提高效率/删除不必要的查询
  • 确保在您的数据库中设置适当的索引
  • 缓存响应
  • 将所有查询编写为原始查询是一种微优化 - 这是一项大量的工作,但回报并不多,并且考虑到开发人员的时间比服务器时间贵得多,因此几乎不值得打扰。即使您有一个非常可怕的查询或一组具有巨大开销的查询,也有更好的方法来处理它 - 在这种情况下,我倾向于在迁移中创建一个存储过程并调用它,而不是直接查询。

© www.soinside.com 2019 - 2024. All rights reserved.