Быстрее рандомизировать многие результаты на MySQL Server или в PHP - PullRequest
6 голосов
/ 12 мая 2009

Это быстрее для рандомизации порядка сортировки большого набора результатов на сервере MySQL или после того, как я получил данные в PHP?

Есть ли у кого-нибудь какие-либо данные для резервного копирования с обеих сторон или даже по неподтвержденным данным?

Ответы [ 4 ]

5 голосов
/ 12 мая 2009

Мое обоснованное предположение, что MySQL побеждает. Это сделано для обработки данных таким образом. Огромные накладные расходы, связанные с переносом всех данных в PHP для сортировки, дают ему преимущество при загрузке.

Конечно, вы можете сами убедиться в этом, выполнив некоторые тесты.

4 голосов
/ 12 мая 2009

Конечно, вы должны сделать это на стороне MySQL.

Но учтите, что ORDER BY RAND() очень неэффективно в MySQL, поскольку требует filesort.

Узнайте, как эффективно выбрать 10 случайные строки при сканировании одной таблицы:

SELECT  *
FROM    (
        SELECT  @cnt := COUNT(*) + 1,
                @lim := 10
        FROM    t_random
        ) vars
STRAIGHT_JOIN
        (
        SELECT  r.*,
                @lim := @lim - 1
        FROM    t_random r
        WHERE   (@cnt := @cnt - 1)
                AND RAND() < @lim / @cnt
        ) i

См. Эту статью в моем блоге для деталей производительности:

Для таблицы записей 1,000,000 она выполняется менее чем за секунду вместо 15 секунд с использованием ORDER BY RAND().

1 голос
/ 12 мая 2009

Использование RAND () в MySQL будет определенно быстрее.

Для рандомизации через PHP вам нужно будет запросить базу данных и поместить данные в память, так что у вас есть целый дополнительный шаг, добавляющий накладные расходы к процессу сортировки.

В MySQL этот тип запроса не будет таким же быстрым, как упорядочение по индексированному значению, но все равно будет высоко оптимизирован.

0 голосов
/ 12 мая 2009

Обратите внимание, что вы используете rand () в качестве объекта оператора order by:

  select * from foo_table order by rand() limit 100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...