Я много читал о недостатках использования "order by rand", поэтому мне не нужно обновлять его. Я думал, так как мне нужно только ограниченное количество строк, извлеченных из db для рандомизации, возможно, я должен сделать:
$r = $db->query("select * from table limit 500");
for($i;$i<500;$i++)
$arr[$i]=mysqli_fetch_assoc($r);
shuffle($arr);
(я знаю, что это только рандомизирует 500 первых строк, будь то).
будет быстрее, чем
$r = $db->("select * from table order by rand() limit 500");
Позвольте мне просто упомянуть, скажем, что таблицы db были упакованы более чем... 10 000 строк.
почему бы вам не сделать это самостоятельно?!? - Ну, у меня есть, но я ищу твое мнение.
спасибо!
500 или 10K, размер выборки слишком мал, чтобы иметь возможность сделать осязаемые выводы. На 100K вы по-прежнему смотрите полторы секунды на этом графике. Если вы все еще обеспокоены производительностью, посмотрите два варианта рандомизированного номера, представленного в этом ответе.
У нас нет ваших данных или настроек, поэтому он оставил вам возможность проверить ситуацию. Существует множество страниц для того, как рассчитать прошедшее время в PHP - создайте две страницы, одна из которых используется в случайном порядке, а другая - с помощью запроса RAND(). Запустите по крайней мере 10 из них и посмотрите.
Я смотрю на это из опыта работы с MySQL.
Расскажите о первом фрагменте кода:
$r = $db->query("select * from table");
for($i=0;$i<500;$i++){
$arr[$i] = mysqli_fetch_assoc($r);
}
shuffle($arr);
Очевидно, что было бы более эффективно использовать LIMIT количество строк в инструкции SQL вместо того, чтобы делать это на PHP.
Таким образом:
$r = $db->query("SELECT * FROM table LIMIT 500");
while($arr[] = mysqli_fetch_assoc($r)){}
shuffle($arr);
Операция SQL будет быстрее, чем делать это в PHP, особенно когда у вас такое большое количество строк. Один хороший способ узнать это сделать бенчмаркинг и выяснить, какая из двух будет быстрее. Моя ставка заключается в том, что SQL будет быстрее, чем перетасовка в PHP.
Итак, мой голос идет за:
$r = $db->query("SELECT * FROM table ORDER BY RAND() LIMIT 500");
while($arr[] = mysqli_fetch_assoc($r)){}
Я уверен, что в вашем случае тасование займет больше времени, но вы можете увидеть эту ссылку для примеров на быстрых случайных наборах из базы данных. Для этого требуется немного дополнительного SQL, но если скорость важна для вас, сделайте это.
http://devzone.zend.com/article/4571-Fetching-multiple-random-rows-from-a-database