Моя база данных насчитывает 300 рядов на данный момент, и в ближайшие годы она будет иметь около 5000 строк. Я хочу знать, как я могу выбрать 20 строк в случайном порядке.MySQL выбирает 20 случайных строк из 300 строк быстро
Я нашел здесь MySQL select 10 random rows from 600K rows fast (где он снова refered к http://jan.kneschke.de/projects/mysql/order-by-rand/), что следующий код производит случайный выбор очень быстро:
SELECT name
FROM random AS r1 JOIN
(SELECT (RAND() *
(SELECT MAX(id)
FROM random)) AS id)
AS r2
WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 1
так в PHP Я попытался следующие, чтобы получить 20 строк:
$anfrage = "SELECT name
FROM random AS r1 JOIN
(SELECT (RAND() *
(SELECT MAX(id)
FROM random)) AS id)
AS r2
WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 20";
$ergebnis=$db->query($anfrage)
or die($db->error);
while($zeile=mysqli_fetch_assoc($ergebnis))print_r($zeile);
Но когда я запускаю сценарий, я не получаю 20 строк большую часть времени. На самом деле вероятность выбора 20 разных строк из 300 составляет около 48,8%.
Могу ли я изменить приведенный выше код, чтобы получить действительно строк очень быстро?
ваша проблема в том, что r2.id может быть 299, и поэтому вы бы только две строки, в которых "r1.id> = r2.id" is true – nidomiro
@niccomatik Я думаю, мне нужно установить Limit в '1' и выполнить весь запрос в цикле. Затем после каждого запроса я должен проверить, является ли полученная строка новой - это то, как это работает? – Adam
даже при 50 000 рядов простой случайный выбор будет быстрым. 5000 строк ничего. MySQL, вероятно, даже не использует индексы по запросам таблиц, размер которых намного проще для сканирования таблицы, поэтому я не уверен, почему вас беспокоит скорость. – Namphibian