Я знаю, что этот вопрос очень похож, но я хотел бы добавить свою конкретную ситуацию и посмотреть, отличается ли ответ.
Я читал, что вы можете просто выполнить ORDER BY RAND (), но это плохая идея для больших таблиц. Тем не менее, я могу ограничить количество строк максимум до 160 с помощью предложения WHERE. Таким образом, вопрос в том, оценивается ли и обрабатывается ли предложение WHERE перед ORDER BY RAND (), что делает это приемлемым решением?
Мой сценарий - я реализую карточную игру. У меня есть стол для колоды и стол для колоды. Я пытаюсь просто взять n случайных карт из таблицы deck_cards. Каждая игра имеет отдельную колоду, поэтому, когда игрок берет n карт, я знаю, что это из определенной колоды, поэтому предлагаемый запрос:
select id
from deck_cards
where deck_id = ? and draw_pile = true
order by rand()
limit 5
Столбец draw_pile для того, как он звучит, я отслеживаю, где находятся карты, в draw_pile или discard_pile.
Кстати, я делаю это в рельсах и пытаюсь перемешать результаты с Array.sort_by { rand }
, но я вижу доказательства того, что рэнд рельсов не совсем случайный. Поэтому другой вопрос заключается в том, что лучше попробовать случайную функцию в SQL или в rails. В настоящее время у меня нет ни ORDER BY RAND, ни Limit в SQL. Я перетасовываю массив результатов в рельсы, а затем просто выталкиваю n карт из этого перемешанного массива. Но, опять же, я вижу результаты, которые указывают на то, что случайное перемешивание на самом деле не происходит случайным образом.
Другая проблема / решение - возможно, блокировка таблицы. Это многопользовательское приложение для игры в реальном времени. Иногда я вижу, что> 1 игрок тянет одну и ту же карту. Я предполагаю, что это происходит из-за того, что игроки рисуют одновременно и нажимают на этот запрос и перемешивают, которые каким-то образом возвращают перекрывающиеся результаты.