我正在使用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 )
第二个查询为什么这么慢?以及如何解决这个问题
答案 0 :(得分:0)
MySQL默认将其索引存储在BTREE中。一般没有散列。
对于性能差异的简短回答是:>表单比=表单评估的节点更多。
答案 1 :(得分:0)
如果您经常使用价格列进行搜索 您可以考虑向该列添加索引以提高性能:
CREATE INDEX books_price_idx ON books (price)