Laravel Eloquent vs SelectRaw。它如何影响查询性能?

时间:2017-11-06 14:16:07

标签: php laravel laravel-5 eloquent

当我们将Eloquent vs SelectRaw用于以下场景时,Laravel如何处理查询:

这会更快地获取数据:

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

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

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

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

1 个答案:

答案 0 :(得分:2)

使用任何ORM总会有一些开销。但是,这几乎总是一个问题。

例如,尽管编写原始SQL可能会略微提高性能,但它通常与首先进行查询的成本相比相形见绌。通过缓存响应,您可以通过在原始SQL中重写ORM查询来获得远远更大的性能提升。

ORM确实更有可能使某些类型的低效低效查询成为可能,但这可以通过使用Clockwork之类的分析器来识别慢速或不必要的查询并重构它们。大多数ORM都有工具来处理像the N+1 problem这样的事情 - 例如,Eloquent有with()方法来急切加载相关的表,这通常比显式编写查询要方便得多。为你做急切的负担。

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

  • 表达表之间的关系通常更容易
  • 它有助于避免PHP和SQL之间的心理上下文切换
  • 它为您做了很多清理数据的工作
  • 它有助于您的应用程序在不同的数据库之间移植(例如,因此您可以使用SQLite进行测试,但在生产中使用MySQL)
  • 如果您的逻辑无法使用ORM表达,那么通常很容易下载到为该部分编写原始SQL

如果您在Web应用程序中查询速度较慢,那么将其重写为原始查询可能是您应该考虑的最后一件事:

  • 重构查询或查询以提高效率/删除不必要的查询
  • 确保在数据库中设置了适当的索引
  • 缓存回复

将所有查询编写为原始查询是一种微观优化 - 为了获得不那么多的回报而付出了很多工作,并且考虑到开发人员的时间比服务器时间要贵得多,它几乎没有价值麻烦。即使您有一个单一的,极其可怕的查询或一组具有巨大开销的查询,也有更好的方法来处理它 - 在这种情况下,我倾向于在迁移中创建存储过程并调用它而不是直接进行查询。