2012-06-13 4 views
0

У меня есть запрос SELECT, от которого я ожидаю миллионы результатов. Мне нужно рандомизировать эти результаты в MySQL. Выполнение этого в моем скрипте после запроса явно использует слишком много ОЗУ. Может кто-то может доработать этот запрос так, чтобы результаты были случайными без использования порядка по rand()? Я видел несколько примеров и пытался их использовать, но они не работают для меня, поскольку все они, похоже, зависят от возвращения всей таблицы, а не с использованием предложения WHERE. Вот мой запрос:MySQL, как безопасно рандомизировать вывод этого запроса?

SELECT * FROM pool 
WHERE gender = 'f' 
AND (`location` = 'united states' OR `location` = 'us' OR `location` = 'usa'); 
+3

Что именно вы пробовали? Вы сказали: «Пробовали некоторые примеры», ну, что это? В чем проблема с использованием ORDER BY RAND()? – Arran

+0

примеры просто не применяются к моему запросу, поэтому я не опубликовал их. ORDER BY RAND() не работает для больших таблиц. раздел заканчивается заполнением, а запрос занимает годы, чтобы заполнить таблицу из 10 миллионов строк. – xendi

+0

'ORDER BY RAND()' с огромными таблицами очень медленный. он генерирует дополнительную временную таблицу, более подробно здесь: Zefiryn

ответ

0

Если у вас есть 10 миллионов строк с идентификаторами, они в непрерывном диапазоне?

  1. Получите самый низкий идентификатор из диапазона, который вы хотите, с помощью быстрого выбора.
  2. Получите самый большой идентификатор.
  3. генерировать случайные числа в этом диапазоне с помощью PHP
  4. раз у вас есть номера «SELECT * FROM table1 WHERE ID IN (цифры, которые вы генерируемой)» или что-то подобное
0

Если вы можете использовать другой язык, например, PHP вы можете использовать его rand() функцию для генерации идентификаторов и добавить в запрос как

$ids = range($mini, $maxid); 
shuffle($ids); 
array_slice($ids, 0, $quantity); 

Или что-то подобное в любом язык, который вы используете.

Если вам нужно сделать, это в чистом MySQL Query, то вот несколько alternaties: http://www.electrictoolbox.com/msyql-alternative-order-by-rand/

+0

, принося 10 миллионов идентификаторов в php и перетасовывая их, не будет работать. его слишком много данных для хранения в ОЗУ. Я видел эту статью, но предполагает, что вы хотите всю таблицу. Если я добавлю предложение WHERE, это не сработает. – xendi

+0

Затем напишите функцию, которая будет генерировать числа $ ids из заданного диапазона. Я предполагаю, что вам нужно, например, 50 строк из этой большой таблицы сразу. – Zefiryn

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