Site Tools


random

Дано: 100 миллионов записей. Требудется:

  1. Получить случайные 10 из тех, которые удовлетворяют условию user_id = 1000 (таких записей около 500к)

Проблема: запрос “where user_id = 1000 order by rand” будет медленным, так как (? будет по не индексному полю (виртуальная колонка с рандомными значениями))

Решение:

1 - offset rand limit 1
select count(id) where user_id = 1000;
select * where user_id offset (рандомное значение с бэка в пределах count) limit 1; и так 10 раз
2 - generate random id на бэке
  • получаем информацию о минимальном и максимальном id для where user_id = 1000
  • генерируем 100 случайных id на бэке
  • select * where user_id = 1000 AND id in (100 случайных id)

Работает только если id индексирован + между ними не большие дырки для where user_id = 1000

3 - хранилище с получением рандома
  • кладем и поддерживаем id в хранилище по ключу user_id в актуальном состояние
  • получаем рандомные 10 id из этого хранилища

Пример такого хранилища - redis с его sets и SRANDMEMBER.

На простом хранилище можно реализовать доступ по хэш-таблице. Например - 500к значений срандомизировать и разделить на чанки по 1000 значений. Предоставить к ним доступ по хэш ключу на подобие: user_id_ . $user_id . rand(хэш) который содержит эти 1000 рандомных id и уже из них получить рандомные 10.
You could leave a comment if you were logged in.
random.txt · Last modified: 2020/09/21 16:39 by conovaloff

Page Tools