我有一个与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
列,或者他们是否经常重新计算投票数?