Mysql: как выбрать рандомную запись? [дубликат]

141
26 марта 2019, 14:50

На данный вопрос уже ответили:

  • Случайная выборка записей mysql 8 ответов

Подобный вопрос задавали не один раз, но работающий способ я так и не нашел.

У меня есть таблица mysql, мне нужно выбрать из нее одну запись, с условием "param = 1". Таблица очень большая, выборка нужна максимально быстрая, "SELECT * FROM table WHERE param = 1 ORDER BY RAND() LIMIT 10;" не подходит.

Помогите пожалуйста решить эту проблему.

Answer 1

Есть вариант для идеальной таблицы, в которой нет пропущенных (удаленных) id. На бекенде можно сгенерировать 10 случайных чисел в нужном диапазоне и получать записи по ним. WHERE id in (...)

Второй вариант для не идеальной таблицы, но позволяет получить лишь одну запись. Тот же рандом на бекенде, но ограниченный числом записей. А дальше OFFSET {random_number} LIMIT 1

UPD: Хотя, говорят большой offset тоже медленно работает. Но, предполагаю что все равно быстрее ORDER BY rand()

UPD 2: Нашел такой вариант реализации:

SELECT f.id FROM files f
    JOIN ( SELECT RAND() * (SELECT MAX(id) FROM files) AS max_id ) AS m
    WHERE f.id >= m.max_id
    ORDER BY f.id ASC
    LIMIT 1;

По ссылке подробности и сравнение с ORDER BY RAND()

А здесь большая и подробная статья с анализом быстродействия трех вариантов

READ ALSO
Как на веб-странице сделать слитые маркеры у списка

Как на веб-странице сделать слитые маркеры у списка

Как получить на html/js/css слитые маркеры у списка (пример на изображении):

199
Происходит слипание блоков <p> в мобильной версии сайта. @midea запросы прописаны

Происходит слипание блоков <p> в мобильной версии сайта. @midea запросы прописаны

Совсем новенький в этом, плюс верстка не моя, сайт не мойЗнаю что HTML & CSS грязный

183