为什么where in()比laravel中的关系更好



我们的laravel应用程序的数据库正在增加,查询时间也在增加。关于查询,我注意到whereIn()relations调用快得多例如

我需要得到客户的所有委托,所以与laravel关系,我会做什么

$customers = Customer::with('consignments')->where('id','>',1)->get();
//and now i can access all consignments
foreach($customers as $customer ){
$customer->consignments
}

但是,即使在使用索引的情况下,这也是非常缓慢的。(也许我没有正确使用索引(

另一方面,如果我使用whereIn(),会快得多

$customer_ids = Customer::selct('id')->where('id','>',1)->pluck('id')->toArray();
$consignments = Consignment::whereIn('customer_id',$customer_ids)->get()

这是非常快的。我在这里犯了什么错误吗?

我们能快速建立拉拉韦关系吗?

您主要比较的是热切加载和懒惰加载。

在您的第一个示例中,您使用的是热切加载。你基本上是一次把所有东西都带来。您对数据库执行一个查询。

在第二个示例中,您使用的是延迟加载。首先,您带来的是用户的信息。第二,你带来了相关的货物。您对数据库执行两个不同的查询。

响应时间取决于不同的因素。

  • 数据库数据大小
  • 数据库结构,如数据类型和索引
  • 数据库服务器资源,如CPU和内存
  • 响应大小
  • 网络带宽

例如,如果您的CPU和内存资源有限,那么您的数据库服务器可能很难尝试处理一个单一但复杂的查询的急切加载方法。

您可以使用toSql()方法获取原始查询。然后,您可以直接在数据库中执行这些查询,并使用查询执行计划来检测哪个查询更适合您的用例。

最新更新