Приходится много делать запросов с order by rand() Итого страница формируется 6-9 сек. Чем заменить rand() или как по другому сделать рандомную выборку из таблицы?
Близкие темы уже не раз обсуждались и здесь и на других форумах. Универсального решения нет, а есть рабочие подходы. Важно помнить, что ORDER BY RAND() каждый раз создает веремнную таблицу без индексов и выбирает данные из неё, поэтому всё медленно. Сводится всё к таким правилам: 1. Надо попытаться уменьшить количество перебираемых записей. Как — зависит от конкретной задачи. Если область выборки будет небольшая, то вся временная таблица под RAND уместится в оперативке сервера и всё будет быстро. 2. Скорость может увеличиться если разбить запрос на два. Сначала как-то вычисляем несколько id, затем по этим id можно выбрать нужные данные. Первую часть пытаемся как-то оптимизировать в рамках задачи. 3. Кешировать результаты или промежуточные данные (подмножество id из которых реально нужен RAND). Добавлено спустя 5 минут 16 секунд: Если нужна ОДНА случайная запись, то может пригодиться такое правило: id записи от 1 до max(id). Вычисляем (берем из кеша) max(id) и затем по нему получаем запись. Если в нумерации возможны "дыры", то SELECT * FROM table WHERE id >=:myrandomid LIMIT 1