3

我正在为 DB 使用 Laravel 5.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 毫秒。代码中唯一的区别是“相等”

where('price', '>', 0 ) 

where('price', '=', 0 )

为什么第二个查询这么慢?以及如何解决这个问题

4

2 回答 2

0

MySQL 默认将其索引存储在 BTREE 中。一般没有散列。

性能差异的简短答案是 > 形式比 = 形式评估更多节点。

于 2018-09-04T09:49:39.030 回答
0

如果您经常使用价格列进行搜索,您可以考虑为该列添加索引以提高性能:

CREATE INDEX books_price_idx ON books (price)
于 2018-09-04T10:21:07.370 回答