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

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

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

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

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

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

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

Спасибо!

Ответы [ 3 ]

8 голосов
/ 17 января 2011

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

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

Вопреки всему, что я прочитал, я создал таблицу под названием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 строкам, которыевозвращаются "ГДЕ число = 41"?(Я специально добавил только 20 строк, которые имели значение «число» для 41).

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

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

0 голосов
/ 17 января 2011

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

0 голосов
/ 17 января 2011

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

...