等于零的地方太慢了

时间:2018-09-04 09:26:09

标签: php mysql laravel laravel-5.6 mysql-8.0

我正在使用Laravel 5.6和MySQL for 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条结果,但RESPONSE在8000毫秒内。而代码中的唯一区别是 “等于”

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

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

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

2 个答案:

答案 0 :(得分:0)

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

对于性能差异的简短回答是:>表单比=表单评估的节点更多。

答案 1 :(得分:0)

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

CREATE INDEX books_price_idx ON books (price)