Php Laravel/雄辩的查询太慢(联接、按计数排序)
我有一个与Pet.php有一对多关系的模型Person.php。我需要根据一个人的宠物数量对他进行分类。此查询可用于: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
$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