MySQL по сравнению с PHP при получении случайного объекта

который более эффективен (при управлении по записям 100K):

A. Mysql

SELECT * FROM user ORDER BY RAND();

конечно, после этого у меня уже были бы все поля от той записи.

B. PHP

memcached использования, чтобы иметь $cache_array содержат все данные из "ВЫБОРА id_user ОТ пользователя ORDER BY id_user" в течение приблизительно 1 часа... и затем:

$id = array_rand ($cache_array);

конечно, после этого я должен выполнить вызов MySQL с:

SELECT * FROM user WHERE id_user = $id;

так..., который более эффективен? A или B?

6
задан Andres SK 31 March 2010 в 15:33
поделиться

3 ответа

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

При этом известно, что ORDER BY RAND () работает медленно, потому что MySQL не может использовать индекс. MySQL в основном запускает функцию RAND () один раз для каждой строки в таблице, а затем сортирует строки на основе того, что получено из RAND () .

Другая ваша идея - хранить все user_id в memcached и затем выбирать случайный элемент из массива, может работать лучше, если накладные расходы memcached окажутся меньше, чем затраты на полное сканирование таблицы. Если у вас большой набор данных или проблема с устареванием, вы можете столкнуться с проблемами. Также вы усложняете свое приложение. Я бы попробовал поискать другой путь.

Я дам вам третий вариант, который может превзойти оба ваших предложения: выберите счетчик (user_id) строк в вашей пользовательской таблице, а затем попросите php сгенерировать случайное число от 0 до результата из count (user_id) минус 1 включительно. Затем выполните SELECT * FROM user LIMIT 1 OFFSET random-number-generated-by-php; .

Опять же, правильный способ ответить на эти типы вопросов - провести сравнительный анализ. Все остальное - предположение.

9
ответ дан 8 December 2019 в 18:34
поделиться

Первый из них невероятно медленный, потому что

MySQL создает временную таблицу со всеми строками результатов и назначает каждой одну из них случайный индекс сортировки. Затем результаты сортируются и возвращаются .

Подробнее об этом написано в блоге .

4
ответ дан 8 December 2019 в 18:34
поделиться
$random_no = mt_rand(0, $total_record_count);

$query = "SELECT * FROM user ORDER BY __KEY__ LIMIT {$random_no}, 1";
0
ответ дан 8 December 2019 в 18:34
поделиться
Другие вопросы по тегам:

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