【发布时间】:2021-12-09 18:44:42
【问题描述】:
我想优化这 3 个查询,使我能够根据日期条件(当前周、上周、自开始以来)显示在我们网站上发布最多照片的用户。
用调试栏测得查询时间为1.5秒,真的很长! 你知道怎么优化吗?
public function show()
{
$currentWeek = User::whereHas('pictures')
->whereHas('pictures', fn ($q) => $q->whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()]))
->withCount(['pictures' => fn ($q) => $q->whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])])
->orderBy('pictures_count', 'DESC')
->limit(10)
->get();
$lastWeek = User::whereHas('pictures')
->whereHas('pictures', fn ($q) => $q->whereBetween('created_at', [Carbon::now()->startOfWeek()->subWeek(), Carbon::now()->endOfWeek()->subWeek()]))
->withCount(['pictures' => fn ($q) => $q->whereBetween('created_at', [Carbon::now()->startOfWeek()->subWeek(), Carbon::now()->endOfWeek()->subWeek()])])
->orderBy('pictures_count', 'DESC')
->limit(10)
->get();
$overall = User::whereHas('pictures')
->whereHas('pictures')
->withCount('pictures')
->orderBy('pictures_count', 'DESC')
->limit(10)
->get();
return view('users.leaderboard', [
'currentWeek' => $currentWeek,
'lastWeek' => $lastWeek,
'overall' => $overall,
]);
}
【问题讨论】:
-
您是否尝试创建数据库列“created_at”的
index? -
不,从来没有,你能解释更多吗? :)
-
是的。索引与在任何书籍的开头列出索引的方式完全相同,以在特定页面上按名称查找项目。数据库使用索引来做同样的事情。例如,您有一个包含 1,00,000 个数据的表,并且您查询以搜索名称“xyz”。因此,在正常情况下,数据库会从头到尾查找“xyz”,并将遍历所有 1,00,000 条记录以找到“xyz”。但是,如果您在“名称”列上创建索引,那么数据库只会查看名称以“x”开头的位置,并且不需要查看所有 1,00,000 条记录,因此查询结果会快得多
-
是的,更多数据需要更多时间才能访问
-
好的,感谢您的宝贵帮助和您的宝贵时间;)
标签: php mysql laravel laravel-query-builder