Хорошая идея / плохая идея? Использование MySQL RAND () вне небольшого набора результатов подзапроса?

Поэтому в MySQL я читал, что для больших таблиц с большим количеством строк использование ORDER BY RAND () – плохая идея (даже с ~ 500 таблицами строк, предположительно). Медленный и неэффективный. Множество сканирований строк.

Как это выглядит (ниже) для альтернативы?

SELECT * FROM (… подзапрос, который обычно возвращает набор из менее чем 20 строк …) ORDER BY RAND () LIMIT 8

Вместо использования RAND () для большого набора данных я бы выбрал небольшое подмножество, и только тогда я бы применил RAND () для возвращаемых строк. В 99,9% всех случаев подзапрос, рассмотренный выше, должен выбирать менее 20 строк (и на самом деле он обычно меньше 8).

Любопытно, что люди думают.

(Просто для справки, я делаю свой материал MySQL с помощью PHP.)

Благодаря!

Solutions Collecting From Web of "Хорошая идея / плохая идея? Использование MySQL RAND () вне небольшого набора результатов подзапроса?"

На самом деле … Я закончил тест, и я, возможно, ответил на свой вопрос. Я думал, что разместил эту информацию здесь, если бы это было полезно для кого-то еще. (Если я сделал что-то не так, пожалуйста, дайте мне знать!)

Это удивительно …

Вопреки всему, что я прочитал, я создал таблицу TestData с 1 миллионом строк и выполнил следующий запрос:

SELECT * FROM TestData WHERE number = 41 ORDER BY RAND () LIMIT 8

… и он вернул строки в среднем 0.0070 секунды. Я действительно не понимаю, почему RAND () имеет такую ​​плохую репутацию. Мне кажется, это полезно для меня, по крайней мере, в этой конкретной ситуации.

У меня три столбца в таблице:

id [BIGINT (20)] | текстовое поле [tinytext] | номер [BIGINT (20)]

Первичный ключ по идентификатору, индекс по числу.

Я думаю, что MySQL достаточно умен, чтобы знать, что он должен применять только RAND () к 20 строкам, которые возвращаются «WHERE number = 41»? (Я специально добавил только 20 строк, которые имели значение 41 для 'number'.)

Альтернативный метод подзапроса возвращает результаты со средним временем около 0,0080 секунд, что медленнее, чем метод не подзапроса.

Метод подзапроса: SELECT * FROM (SELECT * FROM TestData WHERE number = 41) как t ORDER BY RAND () LIMIT 8

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

Я недавно опубликовал эту статью о проблеме: http://www.electrictoolbox.com/mysql-random-order-random-value/, но мне не очень нравится добавлять в мои данные еще один столбец.