Laravel中简单查询的查询检索时间长

时间:2018-01-09 12:01:31

标签: mysql laravel

我在Laravel写了一个查询:

$policy = DB::table('policies')->
  join('customers','policies.customer_id','=','customers.id')->
  join('cities','customers.city_id','=','cities.id')->
  join('policy_motors','policies.id','=','policy_motors.policy_id')->
  join('vehicle_makes','policy_motors.vehicle_make','=','vehicle_makes.id')->
  join('vehicle_models','policy_motors.vehicle_model','=','vehicle_models.id')->
  select('policies.policy_number','policies.insurance_premium','policies.commission',
  'policies.effective_start_date',
  'policies.effective_end_date','customers.name_en',
  'customers.address1','customers.address2','cities.name_en','policy_motors.policy_type',
  'vehicle_makes.name_en','vehicle_models.name_en')->
  where('policies.policy_number','=','DB202017036583')->first();

此查询在我的Mac上完美运行。但是,当我的同事在他的Windows机器上运行相同的查询时,它将永远消失。所以他自己写了一个,那就是:

$policy = Policy::with('customer', 'motor', 'user')->
  where('policy_number', 'RK202117017053')->first();

他的查询在他的Windows和我的Mac上完美运行。

问题: 虽然我的查询只选择了必需的列,但它需要永远。但是他的查询占用了连接表的所有列,执行速度更快。为什么会这样?

2。它在不同的机器上运行查询有何不同,时差应该是显着的?

2 个答案:

答案 0 :(得分:1)

  
      
  1. 虽然我的查询只选择了必需的列,但它需要永远。但他的查询,其中包含所有已加入的列   表执行得更快。为什么会这样?
  2.   

即使您的查询只选择了几个列,它也会对表进行大量子查询,如果它们没有正确的索引,则会导致执行时长。

他的查询速度更快,因为laravel执行eager loading的方式。 Laravel不对同一个查询进行子查询,它会进行大量查询并使用集合建立关系。我的意思基本上是你的查询运行了很多内部查询,而你的伙伴做了多个查询,然后使用集合合并它们

  
      
  1. 在不同的机器上运行查询有什么不同,时差应该是那么重要?
  2.   

此外,如果查询在本地运行,则可能会有一些差异。通常SQL咨询需要内存和处理器功能来进行搜索和加入,因此如果您的PC因任何原因而运行不足,则在适当的条件下比PC需要更多的时间。但是如果SQL机器在云端,那么执行就不应该有任何区别

答案 1 :(得分:0)

第二次查询更快的原因是它使用急切加载

渴望加载关系

看一下这个链接  Eager Loading