Мне нужно получить несколько случайных записей из таблицы. Таблица содержит около 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;