Я использую 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 )
Почему второй запрос такой медленный? И как это исправить
MySQL хранит свои индексы по умолчанию в BTREE. Нет хеширования в общем.
Краткий ответ на разницу в производительности заключается в том, что форма> оценивает больше узлов, чем форма =.
Если вы часто используете колонку цен для поиска
Вы можете добавить индекс в этот столбец, чтобы повысить производительность:
CREATE INDEX books_price_idx ON books (price)