Php 拉威尔雄辩vs SelectRaw。它对查询性能有何影响?

Php 拉威尔雄辩vs SelectRaw。它对查询性能有何影响?,php,laravel,laravel-5,eloquent,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'") ); 或者这会更快地获取我的数据: $data = Records::where('active', 1)->get(); $d

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

这会更快地获取数据吗:

$data = Records::where('active', 1)->get();
$data = DB::select( DB::raw("SELECT * from records WHERE active ='1'") ); 
或者这会更快地获取我的数据:

$data = Records::where('active', 1)->get();
$data = DB::select( DB::raw("SELECT * from records WHERE active ='1'") ); 

当我们处理大约500000条记录的大数据时,使用SelectRaw是否会影响查询处理速度

使用任何ORM都会带来一些开销。然而,这几乎永远都不是问题

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

ORM确实会使某些类型的低效查询变得更加缓慢,但这是可以通过使用探查器来解决的,比如识别那些缓慢或不必要的查询并重构它们。大多数ORM都有工具来处理这样的事情——例如,Eloquent有
with()
方法来急切地加载相关的表,这通常比显式地编写查询来为您完成急切的加载要方便得多

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

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

如果在Web应用程序中有一个缓慢的查询,那么将它改写为原始查询可能是您应该考虑的最后一件事,之后:

  • 重构一个或多个查询以提高效率/删除不必要的查询
  • 确保在数据库上设置了适当的索引
  • 缓存响应

将所有查询编写为原始查询是一项微观优化——要获得不太多的回报需要大量的工作,而且考虑到开发人员的时间比服务器的时间要昂贵得多,这几乎不值得费心。即使您有一个非常可怕的查询或一组开销巨大的查询,也有更好的方法来处理它——在这种情况下,我倾向于在迁移中创建一个存储过程并调用它,而不是直接进行查询。

使用任何ORM都会有一些开销。然而,这几乎永远都不是问题

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

ORM确实会使某些类型的低效查询变得更加缓慢,但这是可以通过使用探查器来解决的,比如识别那些缓慢或不必要的查询并重构它们。大多数ORM都有工具来处理这样的事情——例如,Eloquent有
with()
方法来急切地加载相关的表,这通常比显式地编写查询来为您完成急切的加载要方便得多

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

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

如果在Web应用程序中有一个缓慢的查询,那么将它改写为原始查询可能是您应该考虑的最后一件事,之后:

  • 重构一个或多个查询以提高效率/删除不必要的查询
  • 确保在数据库上设置了适当的索引
  • 缓存响应

将所有查询编写为原始查询是一项微观优化——要获得不太多的回报需要大量的工作,而且考虑到开发人员的时间比服务器的时间要昂贵得多,这几乎不值得费心。即使您有一个非常可怕的查询或一组开销巨大的查询,有更好的方法来处理它-在这种情况下,我倾向于在迁移中创建一个存储过程并调用它,而不是直接进行查询。

有具体的例子吗?这个更新的desc可以吗?您可以使用
toSQL()
而不是
get()
来检查实际的查询是什么。在这种情况下,它们将是相同的,因此没有区别任何具体示例?此更新的描述是否正确?您可以使用
toSQL()
而不是
get()
检查实际查询是什么。在这种情况下,它们是相同的,因此没有区别