Php 哪里等于零,速度太慢了

Php 哪里等于零,速度太慢了,php,mysql,laravel,laravel-5.6,mysql-8.0,Php,Mysql,Laravel,Laravel 5.6,Mysql 8.0,我使用的是Laravel5.6和MySQL数据库 public function getTopPaid(){ $books = Book::with('users')->where('price', '>', 0 )->get() ->sortByDesc(function ($book){ return $book->users->count();//sorting by purchased users cou

我使用的是Laravel5.6和MySQL数据库

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毫秒。代码中唯一的区别是 “平等”


为什么第二个查询这么慢?以及如何修复这个问题,MySQL默认将其索引存储在BTREE中。一般不使用散列


对于性能差异的简单回答是,如果经常使用price列进行搜索,>窗体比=窗体计算的节点更多。

您可以考虑向该列添加索引以提高性能:

CREATE INDEX books_price_idx ON books (price)

这两个查询都有两个不同的输出集,第一个需要1700毫秒,第二个需要8毫秒。然后问为什么第二个这么慢。这就是你的意思吗?是的,这不是你想要的答案,但如果你真的关心性能,你应该避免从数据库中获取所有记录(
->get()
),然后用PHP进行聚合(
->sortByDesc()
)。相反,您应该使用适当的
groupBy
查询来利用对数据库的聚合。否则,当您有数千条记录时,您的解决方案将无法很好地扩展(因为您将始终获取所有记录,但只保留25条记录)@AkbarTukhtamurodov您确定吗?你想知道为什么第二个这么慢吗?8比1700少得多。第二个查询可能更快,因为它可以处理更少的记录(由于更精确的
=
),可能涉及索引。我们没有足够的信息来确定。我在写作中犯了一个错误,不是8毫秒,而是8000毫秒,即8秒。
where('price', '=', 0 )
CREATE INDEX books_price_idx ON books (price)