Извлеките 50 случайных записей из таблицы базы данных Mysql (большой набор данных)

Мне нужно получить несколько случайных записей из таблицы. Таблица содержит около 100000 записей.

Записи не должны быть последовательными, и производительность важна.

Я попробовал « order by rand() », но производительность плохая ( ~ 3 секунды)

Вы можете попытаться сделать это в петле php, но я сомневаюсь, что это будет быстрее ..

 $iMaxID = getMaxIdFromYourTable(); //not real php $records = array(); while (true) { $iRandID = rand(1,$iMaxID); thisRecord = "SELECT FROM yourtable WHERE id = $iRandID"; if (numrows > 0) { $records[] = thisRecord; if (count($records) > 50) { break; } } } 

Я просто запускал простой SELECT * FROM table ORDER BY RAND() LIMIT 50; на столе с 229 291 строками. Завершено через 0,63 секунды. Учитывая, что RAND () действительно медленный, и должно быть лучшее решение.

Я знаю только о различных альтернативных способах выбора только одной случайной строки из большого набора данных быстрее, чем использование ORDER BY RAND() . который поясняется здесь: http://wanderr.com/jay/order-by-slow/2008/01/30/

Для нескольких случайных строк я в настоящее время не знаю лучшего решения. Если идентификаторы являются следующими, и между ними нет идентификаторов, вы можете создать список случайных чисел, разделенных запятыми, в вашем собственном PHP-коде, а затем использовать SELECT * FROM table WHERE id IN(5,3,1); запрос.

Вот работающее решение, в другом вопросе переполнения стека: как я могу оптимизировать функцию ORDER BY RAND () MySQL?

Работала для меня, 50 строк в наборе (0,09 сек) для таблицы с 229,291 записями.

 SET @o = (SELECT FLOOR(RAND() * COUNT(*)) FROM your_table); PREPARE STMT FROM 'SELECT * FROM your_table LIMIT ?, 1'; EXECUTE STMT USING @o;