2013-03-15 4 views
1

У меня есть запрос, который состоит из объединений и имеет выход около 30 000 + записей. Я хотел бы получить 10 случайных строк из этих записей, не используя команду SQL ORDER BY rand().Получите 10 строк из запроса

Я пробовал прокручивать записи и помещать их в массив и перемешать (получить 1-й 10 после тасования), но для генерации требуется около 8-12 секунд. Я хотел бы сократить это время обработки любой ценой.

Как это осуществить?

+0

И каков ваш текущий запрос? –

+0

И почему вы не хотите использовать rand()? – creinig

+0

Я не уверен, что можно получить случайные строки только из запроса без использования rand. Вы используете MySQL? – chawkinsuf

ответ

8

Хорошо, если вы не хотите использовать RAND() сделать гораздо быстрее выбрать из всего столбца идентификаторов первого затем выберите только 10 строк, которые вы хотите

  1. Выберите идентификаторы в $ IdArray
    SELECT id FROM table
  2. Перемешать и нарезать $ IdArray
    shuffle($idarray);
    $ids=array_slice($idarray,0,10);
  3. Выберите полные строки
    $sql="SELECT ... WHERE id IN (".implode(', ', $idarray).")";

Редактировать: Это, безусловно, намного быстрее, чем использование ORDER BY RAND()!

+1

Извлечение 30000+ идентификаторов (и рост) из базы данных, перетасовка их, а затем отбрасывание 29990+ из них, безусловно, будет намного медленнее, чем позволить РСУБД делать рандомизацию ... – creinig

+0

Я только что проверил выбор количества идентификаторов из база данных и ORDER BY RAND() LIMIT 10 из * только столбца id * занимает в 30 + раз больше времени, чем без ORDER BY и LIMIT. – Popnoodles

+0

... выбор 30 столбцов с использованием ORDER BY и LIMIT занимает более 1000 раз. PHP занимает 0,003 секунды, чтобы перетасовать и нарезать 30 000 идентификаторов. – Popnoodles

Смежные вопросы