Как сделать случайную выборку MySQL чтоб не грузить сервер?

400
04 февраля 2017, 11:03

Здравствуйте.

Встала задача - сделать случайную выборку 10 строк из таблицы. В таблице пока мало записей, но вскоре она разрастётся до десятков тысяч. Дело осложняется тем, что есть дополнительное условие выборки, а также в id могут встречаться дыры. По сути сам запрос прост:

SELECT id, title, desc FROM my_table WHERE group_id=25 ORDER BY RAND() LIMIT 10;

Но в таком виде он в будущем, наверно, станет сильно грузить сайт...
Вопрос: посоветуйте, как лучше оптимизировать всё это дело?

Можно как с помощью sql, так и на php.
Заранее дико благодарен за помощь.

Answer 1

Примерно вот так:

SELECT id, title, desc
  FROM my_table AS r1 JOIN
       (SELECT CEIL(RAND() *
                     (SELECT MAX(id)
                        FROM my_table)) AS id)
        AS r2
 WHERE r1.id >= r2.id AND group_id=25
 ORDER BY r1.id ASC
 LIMIT 10

В моем случая в таблице с 8 миллионами записей отрабатывает за 202ms, когда с ORDER BY RAND() за 15s

Оригинальный ответ от @Riedsio

READ ALSO
Как выбрать все заказы пользователя Bitrix

Как выбрать все заказы пользователя Bitrix

Как выбрать все заказы пользователя с ид 12 за февраль? По идеи это делается через АПИКто нибуть подскажите

674
Отправка почты через внешний SMTP

Отправка почты через внешний SMTP

Настроил локально на денвере как описано здесь все отлично работает, письма уходят, все суперПеренес на хостинг пишет ошибку fsockopen(): unable...

414
Как произвести авторизацию к API docdoc.ru посредством PHP?

Как произвести авторизацию к API docdoc.ru посредством PHP?

Здравствуйте! Я новичок, и мне не понятно кое что по PHP, в частности помогите мне разобраться с тем, как осуществляется авторизация к API другого...

803
Запуск программы из скрипта php

Запуск программы из скрипта php

Всем привет, знаю что задаю может быть и глупый вопрос но информации не где не нашел, прошу строго не судить с php занимаюсь не давно, смысл...

374