Я ищу эффективный способ случайного выбора 100 строк, удовлетворяющих определенным условиям из таблицы MySQL, с потенциально миллионами строк.Как случайным образом выбрать несколько строк, удовлетворяющих определенным условиям, из таблицы MySQL?
Практически все, что я нашел, позволяет избежать использования ORDER BY RAND() из-за низкой производительности и масштабируемости.
Однако this article предлагает ORDER BY RAND() все еще может использоваться как «хороший и быстрый способ» для получения данных randow.
На основании этой статьи ниже приведен пример кода, показывающего, что я пытаюсь выполнить. Мои вопросы:
Является ли это эффективным способом случайного выбора 100 (или до нескольких сотен) строк из таблицы с потенциально миллионы строк?
Когда производительность будет проблемой?
SELECT user.* FROM ( SELECT id FROM user WHERE is_active = 1 AND deleted = 0 AND expiretime > '.time().' AND id NOT IN (10, 13, 15) AND id NOT IN (20, 30, 50) AND id NOT IN (103, 140, 250) ORDER BY RAND() LIMIT 100 ) AS random_users STRAIGHT JOIN user ON user.id = random_users.id
Имеет смысл выбирать случайные значения в поле с индексом. – Kayser
@Kayser, я обеспокоен тем, что нам еще нужно сканировать ВСЕ строки для условий WHERE. Это повлияет на производительность с огромной таблицей (возможно, миллионы строк)? – user1298692
Метод с помощью pk-subselect скорее всего уменьшит лишь незначительное время выполнения. Это потому, что с этой техникой или без нее, rand() вызывается для всех совпадающих строк, а количество строк для сортировки одинаковое. Предположительно, это интересно, если «пользователь» имеет множество столбцов или больших столбцов по размеру, а mysql недостаточно умен, чтобы ждать после того, как LIMIT имеет место для материализации пользователя. * (Который должен быть протестирован). –