Поэтому в MySQL я читал, что для больших таблиц с большим количеством строк использование ORDER BY RAND () – плохая идея (даже с ~ 500 таблицами строк, предположительно). Медленный и неэффективный. Множество сканирований строк.
Как это выглядит (ниже) для альтернативы?
SELECT * FROM (… подзапрос, который обычно возвращает набор из менее чем 20 строк …) ORDER BY RAND () LIMIT 8
Вместо использования RAND () для большого набора данных я бы выбрал небольшое подмножество, и только тогда я бы применил RAND () для возвращаемых строк. В 99,9% всех случаев подзапрос, рассмотренный выше, должен выбирать менее 20 строк (и на самом деле он обычно меньше 8).
Любопытно, что люди думают.
(Просто для справки, я делаю свой материал MySQL с помощью PHP.)
Благодаря!
На самом деле … Я закончил тест, и я, возможно, ответил на свой вопрос. Я думал, что разместил эту информацию здесь, если бы это было полезно для кого-то еще. (Если я сделал что-то не так, пожалуйста, дайте мне знать!)
Это удивительно …
Вопреки всему, что я прочитал, я создал таблицу 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/, но мне не очень нравится добавлять в мои данные еще один столбец.