2015-03-24 2 views
1

Я бег следующего запроса:Оптимизируйте поиск небольшого количества записей из базы данных?

User.where("number > ?", 5).order(&:age).first(20) 

Я заметил, что скорость запроса был примерно таким же заменил ли я «первый (20)» с «первыми (200)» или даже просто «первым ». Это, по-видимому, означает, что все записи извлекаются сервером, независимо от того, сколько записей я действительно хочу в массиве. Есть ли способы ускорить этот процесс?

+0

Как 'order', так и' first' будут использовать лимит и создать тот же sql. Вы можете просмотреть запрос в журнале или в консоли, а затем взять sql на консоль db, чтобы «объяснить» его, чтобы изучить использование индекса. Это может быть так же быстро, как и 20, как 200, потому что это не значительная разница. – Swards

ответ

2

Производительность вполне может быть похожа, потому что в целом база данных будет иметь, чтобы идентифицировать все строки, которые соответствуют условиям, затем закажите их все, а затем прочитайте первые n строк из отсортированного набора. Если n равно 200, то, очевидно, ему придется возвращать большее количество строк в приложение, но основной драйвер базы данных - это, вероятно, не количество возвращаемых строк, а количество строк, которые нужно заказать.

Как и другие государства:

User.where("number > ?", 5).order(:age).limit(20) 

... или получить те, с самым высоким возрастом ...

User.where("number > ?", 5).order(:age => :desc).limit(20) 

(Rails 4 синтаксис)

Есть случаи, когда база данных может использовать индекс для предоставления порядка сортировки, и в этом случае вы, вероятно, увидите гораздо большую разницу в производительности между 20 или 200 строками.

2

Вы можете выполнить запрос с limit:

User.where("number > ?", 5).order(:age).limit(20) 

Установите этот флажок Rails Guides article другие примеры.

Удачи вам!

+1

Почему '' 'необходимо? –

+0

да .. я знаю. Вот почему я спросил. Удалите его. –

+0

Эй! Спасибо что подметил это! Вы абсолютно правы! –

1

Вы можете использовать ограничение, так как Вы заказываете результаты:

User.where("number > ?", 5).order('age desc').limit(20) 
+1

Почему '' 'необходимо? –

+1

'order' dosent принимать' proc' как аргумент. –

+0

хороший звонок. я просто вставил в код из примера и поменялся первым для ограничения. Обновленный код –

Смежные вопросы