PHP, MySQL - будет ли случайный случай с массивом результатов быстрее, чем «выбрать… упорядочить по rand ()»?

0

Я много читал о недостатках использования "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 строк.

почему бы вам не сделать это самостоятельно?!? - Ну, у меня есть, но я ищу твое мнение.

спасибо!

  • 1
    Вы хотите рандомизировать порядок первых 500 строк или вернуть 500 случайных строк? Это важное различие, и ваши два решения будут давать разные результаты!
  • 0
    Я понимаю, что вы говорите, но в любом случае мне было бы хорошо. Я просто ищу самый быстрый способ обойти это.
Показать ещё 1 комментарий
Теги:
mysqli
random

3 ответа

1
Лучший ответ

500 или 10K, размер выборки слишком мал, чтобы иметь возможность сделать осязаемые выводы. На 100K вы по-прежнему смотрите полторы секунды на этом графике. Если вы все еще обеспокоены производительностью, посмотрите два варианта рандомизированного номера, представленного в этом ответе.

У нас нет ваших данных или настроек, поэтому он оставил вам возможность проверить ситуацию. Существует множество страниц для того, как рассчитать прошедшее время в PHP - создайте две страницы, одна из которых используется в случайном порядке, а другая - с помощью запроса RAND(). Запустите по крайней мере 10 из них и посмотрите.

  • 0
    спасибо, я действительно прочитал эту ветку пару раз, прежде чем опубликовать этот вопрос.
1

Я смотрю на это из опыта работы с 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)){}
  • 1
    RAND () не масштабируется ... как только вы попадаете в ряды тысячами, он резко замедляется.
  • 0
    благодарю вас! и я увидел ту ошибку, которую вы упомянули, и исправил ее.
Показать ещё 2 комментария
0

Я уверен, что в вашем случае тасование займет больше времени, но вы можете увидеть эту ссылку для примеров на быстрых случайных наборах из базы данных. Для этого требуется немного дополнительного SQL, но если скорость важна для вас, сделайте это.

http://devzone.zend.com/article/4571-Fetching-multiple-random-rows-from-a-database

Ещё вопросы

Сообщество Overcoder
Наверх
Меню