Получить 50 случайных записей из таблицы базы данных Mysql (большой набор данных) - PullRequest
3 голосов
/ 22 февраля 2011

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

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

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

Ответы [ 3 ]

0 голосов
/ 22 февраля 2011

Я только что запустил простую 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 записями.

0 голосов
/ 22 февраля 2011
SET @o = (SELECT FLOOR(RAND() * COUNT(*)) FROM your_table);
PREPARE STMT FROM 'SELECT * FROM your_table LIMIT ?, 1';
EXECUTE STMT USING @o;
0 голосов
/ 22 февраля 2011

Вы можете попробовать сделать это в цикле 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;
        }
    }
}
...