Быстрее рандомизировать много результатов на MySQL Server или в PHP

Вы можете использовать теги для запуска определенных функций / сценариев или не запускать их.

Чтобы конкретно игнорировать их, см. Игнорирование подмножества сценариев :

«Вы можете сказать Cucumber игнорировать сценарии с определенным тегом:

Использование класса бегуна JUnit :

@CucumberOptions(tags = "not @smoke")
public class RunCucumberTest {}

"

6
задан UnkwnTech 12 May 2009 в 03:41
поделиться

4 ответа

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

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

5
ответ дан 10 December 2019 в 00:44
поделиться

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

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

См., Как выбрать 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 записей,

4
ответ дан 10 December 2019 в 00:44
поделиться

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

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

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

1
ответ дан 10 December 2019 в 00:44
поделиться

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

  select * from foo_table order by rand() limit 100
0
ответ дан 10 December 2019 в 00:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: