Php Laravel/雄辩的查询太慢(联接、按计数排序)

Php Laravel/雄辩的查询太慢(联接、按计数排序),php,mysql,laravel,eloquent,laravel-query-builder,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', 'd

我有一个与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:

该数据库的种子是50000人和100000只宠物。按pets_计数排序需要350毫秒(而按不带联接的人员列排序需要18毫秒)。我没有添加任何索引

我怎样才能使它更快


我可以向persons添加
pets\u count
列,并且必须经常小心地更新它,然后在没有连接和计数的情况下加快查询速度。这是好的做法吗?是否有一个关于问题的
投票数\u count
列,或者他们经常重新计算投票数?

我猜查询结果类似于
选择人员。*,将(pets.id)计算为宠物\u count FROM persons INNER JOIN pets on persons.id=pets.person\u id按宠物排序\u count DESC
。。。因此,如果您在开始时抛出一个
EXPLAIN
,并直接在数据库上运行它,它可能会标记出一些东西。顺便说一句,你们的人不能分享宠物吗?那太卑鄙了!;)哦-我错过了分组时间:
解释选择人员。*,计数(pets.id)作为宠物从个人内部加入宠物在个人上。id=pets.person\u id按个人分组。id按宠物排序\u count DESC
我猜,
按宠物排序
会减慢速度,因为它必须在选择所有内容后重新排序列表-而且因为它是一个动态列-
计数(pets.id)
-上面不能有索引。您的数据库索引是否正确?快速测试:您可以尝试在任何地方添加索引,这样效果会更好。请注意“在任何地方添加索引”方法。为了进行调试,只需要在查询中引用的列上使用它,即使这样,之后仍然需要删除索引。索引所有地方最终会导致查询速度变慢,因为这将快速消耗RAM和交换空间。
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