Laravel / Eloquent查询太慢(join,orderBy count)

时间:2017-03-02 16:06:44

标签: php mysql laravel eloquent laravel-query-builder

我有一个与Pet.php有一对多关系的模型Person.php。我需要根据这个人的宠物数来对人进行排序。此查询有效:

$persons = Person::join('pets', 'persons.id', 'pets.person_id')
    ->select('persons.*', DB::raw('count(pets.id) as pets_count'))
    ->groupBy('id')
    ->orderBy('pets_count', 'desc')
    ->limit(100)
    ->get();

SQL:

select `persons`.*, count(pets.id) as pets_count 
from `persons` 
inner join `pets` on `persons`.`id` = `pets`.`person_id` 
group by `id` 
order by `pets_count` desc 
limit 100

该数据库播种有50,000人和100,000只宠物。 pets_count排序需要350毫秒(而没有连接的人列排序需要18毫秒)。我没有添加任何索引。

如何让它更快?

我可以向人员添加pets_count列,并且必须经常仔细地更新它,然后这个查询可以加速而不需要连接和计数。这是好习惯吗? SO是否在问题上有votes_count列,或者他们是否经常重新计算投票数?

0 个答案:

没有答案