На данный вопрос уже ответили:
Подобный вопрос задавали не один раз, но работающий способ я так и не нашел.
У меня есть таблица mysql, мне нужно выбрать из нее одну запись, с условием "param = 1". Таблица очень большая, выборка нужна максимально быстрая, "SELECT * FROM table WHERE param = 1 ORDER BY RAND() LIMIT 10;" не подходит.
Помогите пожалуйста решить эту проблему.
Есть вариант для идеальной таблицы, в которой нет пропущенных (удаленных) 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()
А здесь большая и подробная статья с анализом быстродействия трех вариантов
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Как получить на html/js/css слитые маркеры у списка (пример на изображении):
Совсем новенький в этом, плюс верстка не моя, сайт не мойЗнаю что HTML & CSS грязный