【发布时间】:2019-02-09 07:07:19
【问题描述】:
我将 Laravel 5.6 和 MySQL 用于 DB
public function getTopPaid(){
$books = Book::with('users')->where('price', '>', 0 )->get()
->sortByDesc(function ($book){
return $book->users->count();//sorting by purchased users count
})->take(25);
return new BooksWithAuthors($books);
}
我想使用上面的代码获得购买次数最多的付费书籍。这很好,响应时间为 1700 毫秒。以及大约 400 条记录。
但是下面的代码几乎是一样的:
public function getTopFree(){
$books = Book::with('users')->where('price', '=', 0 )->get()
->sortByDesc(function ($book){
return $book->users->count();
})->take(25);
return new BooksWithAuthors($books);
}
结果中只有 34 条记录,但响应时间为 8000 毫秒。代码的唯一区别是 “相等”
where('price', '>', 0 )
和
where('price', '=', 0 )
为什么第二个查询这么慢?以及如何解决这个问题
【问题讨论】:
-
两者都是两个不同的查询,具有两组不同的输出。
-
你说第一个需要1700毫秒,第二个需要8毫秒。然后问为什么第二个这么慢。你是这个意思吗?
-
是的,克里斯·李尔
-
不是您想要的答案,但如果您真的关心性能,您应该避免从数据库中获取所有记录 (
->get()),然后在 PHP (->sortByDesc()) 中进行聚合。相反,您应该使用适当的groupBy查询来利用对数据库的聚合。否则,当您有数千条记录时,您的解决方案将无法很好地扩展(因为您将始终获取所有记录但只保留 25 条) -
@AkbarTukhtamurodov 你确定吗?你想知道为什么 second 这么慢吗? 8 比 1700 少很多。第二个查询可能更快,因为它适用于更少的记录(由于更精确的
=),可能涉及索引,可能有可能。我们没有足够的信息来确定。
标签: php mysql laravel laravel-5.6 mysql-8.0