В каком порядке Rails выполняет запросы к БД - PullRequest
1 голос
/ 31 января 2010

В Выберите n объектов случайным образом с условием в Rails Anurag любезно предложил этот ответ, чтобы случайным образом выбрать n сообщений с голосами> = x

Post.all(:conditions => ["votes >= ?", x], :order => "rand()", :limit => n)

меня беспокоит то, что количество постов, у которых более x голосов, очень велико.

в каком порядке БД применяет этот критерий к запросу?

делает это

  • (а) выберите n постов с голосами> х, а затем рандомизирует его? или
  • (b) выбрать все сообщения с голосами> x, а затем рандомизировать, а затем выбрать n первых сообщений?
  • (с) другое?

Ответы [ 3 ]

3 голосов
/ 31 января 2010

Рекомендация проверять журнал разработки очень полезна.

Однако в этом случае рандомизация происходит на стороне MySQL, а не внутри Active Record. Чтобы увидеть, как выполняется запрос внутри MySQL, вы можете скопировать запрос из журнала и вставить его в выбранный инструмент MySQL (консоль, графический интерфейс и т. Д.) И добавить «EXPLAIN» в начало.

Вы должны получить что-то вроде:

EXPLAIN SELECT * FROM posts WHERE votes >= 'x' ORDER BY rand() LIMIT n 

Когда я пытаюсь выполнить аналогичный запрос в MySQL, мне говорят:

Select Type: SIMPLE
Using where; Using temporary; Using filesort

Тогда вам следует найти несколько полезных советов по SO, как оптимизировать запросы MySQL. Если есть проблема, добавление индекса в столбце голосов может улучшить производительность. ситуация.

1 голос
/ 31 января 2010

Как уже указывал Тоби, это зависит только от SQL-сервера, все делается в самом запросе.

Однако я боюсь, что вы не сможете получить действительно рандомизированный вывод, если база данных сначала не получит весь набор результатов, а затем не рандомизирует его. Тем не менее, вы все равно должны проверить результат EXPLAIN.

0 голосов
/ 31 января 2010

Найдите в development.log сгенерированный запрос, должен дать подсказку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...