который более эффективен (при управлении по записям 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?
Правильный способ ответить на этот вопрос - провести тест. Сделайте быструю и грязную реализацию каждого способа, а затем запустите тесты производительности, чтобы определить, какой из них работает лучше.
При этом известно, что 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;
.
Опять же, правильный способ ответить на эти типы вопросов - провести сравнительный анализ. Все остальное - предположение.
Первый из них невероятно медленный, потому что
MySQL создает временную таблицу со всеми строками результатов и назначает каждой одну из них случайный индекс сортировки. Затем результаты сортируются и возвращаются .
Подробнее об этом написано в блоге .
$random_no = mt_rand(0, $total_record_count);
$query = "SELECT * FROM user ORDER BY __KEY__ LIMIT {$random_no}, 1";