У меня есть очень большой стол (более 10 млн или даже 100 млн записей), с этой схемой:Выберите случайную строку для каждой группы в большой таблице
ид Int первичный ключ, правило Int
и хотите выберите случайную запись для каждого правила. Я попробовал этот запрос, но это занимает много времени (TreeNode этого имя таблицы):
SELECT tmp.id,tmp.rule FROM treenode
LEFT JOIN (SELECT * FROM treenode ORDER BY RAND()) tmp ON (treenode.rule = tmp.rule)
GROUP BY tmp.rule;
Хранение данных как Хеш в памяти занимает огромную память. Другим вариантом является выборка каждой группы из базы данных и выбор случайной записи. Опять же, поскольку количество групп составляет около 100 тыс., Отправка этого количества запросов в базу данных занимает много времени.
обновление: Я могу добавить, что эта таблица заполняется только один раз, и на ней не будет никаких изменений. Идентификатор и правило имеют в них дыры.
В зависимости от специфики ваших данных возможны различные оптимизации. прочитайте его: http://jan.kneschke.de/projects/mysql/order-by-rand/ – goat
Это больше о получении случайной записи из таблицы не для группы –