我在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。它在不同的机器上运行查询有何不同,时差应该是显着的?
答案 0 :(得分:1)
- 虽然我的查询只选择了必需的列,但它需要永远。但他的查询,其中包含所有已加入的列 表执行得更快。为什么会这样?
醇>
即使您的查询只选择了几个列,它也会对表进行大量子查询,如果它们没有正确的索引,则会导致执行时长。
他的查询速度更快,因为laravel
执行eager loading
的方式。 Laravel不对同一个查询进行子查询,它会进行大量查询并使用集合建立关系。我的意思基本上是你的查询运行了很多内部查询,而你的伙伴做了多个查询,然后使用集合合并它们
- 在不同的机器上运行查询有什么不同,时差应该是那么重要?
醇>
此外,如果查询在本地运行,则可能会有一些差异。通常SQL咨询需要内存和处理器功能来进行搜索和加入,因此如果您的PC因任何原因而运行不足,则在适当的条件下比PC需要更多的时间。但是如果SQL机器在云端,那么执行就不应该有任何区别
答案 1 :(得分:0)