Где равен нулю так медленно - PullRequest
0 голосов
/ 04 сентября 2018

Я использую 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 записи в результате, но RESPONSE находится в 8000 миллисекунд. И единственное отличие в коде "равно"

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

и

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

Почему второй запрос такой медленный? И как это исправить

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Если вы часто используете столбец цены для поиска Вы можете добавить индекс в этот столбец для повышения производительности:

CREATE INDEX books_price_idx ON books (price)
0 голосов
/ 04 сентября 2018

MySQL хранит свои индексы по умолчанию в BTREE. В общем, нет хеширования.

Краткий ответ на разницу в производительности заключается в том, что форма> оценивает больше узлов, чем форма =.

...