2009-12-12 5 views
0

J'ai lu beaucoup de choses sur les inconvénients de l'utilisation de "order by rand", donc je n'ai pas besoin de mise à jour là-dessus. Je pensais, puisque je ne ai besoin d'une quantité limitée de lignes extraites de la db à répartition aléatoire, peut-être que je dois faire:PHP, MySQL - les résultats-array shuffle seraient-ils plus rapides que "select ... order by rand()"?

$r = $db->query("select * from table limit 500"); 
for($i;$i<500;$i++) 
$arr[$i]=mysqli_fetch_assoc($r); 
shuffle($arr); 

(je sais que ce ne randomizes les 500 premières lignes, que ce soit).

serait-ce plus rapide que

$r = $db->("select * from table order by rand() limit 500"); 

-moi de mentionner juste, disent les tables db ont été emballés avec plus de ... 10.000 lignes. Pourquoi ne pas le faire vous-même?!?

- Eh bien, j'ai, mais je suis à la recherche de votre opinion expérimentée.

merci!

+1

Voulez-vous randomiser l'ordre des 500 premières lignes, ou renvoyer 500 lignes aléatoires? C'est une distinction importante, et vos deux solutions produiront des résultats différents! – Artelius

+0

Je comprends ce que vous dites, mais de toute façon serait bon pour moi. Je cherche juste le moyen le plus rapide de contourner cela. – Gal

+0

Le moyen le plus rapide est de récupérer 500 lignes * puis de les mélanger.Je crois qu'il est possible de le faire dans SQL (qui serait probablement plus rapide qu'une solution PHP) mais il faudrait une requête différente de celle que vous suggérez. – Artelius

Répondre

1

500 ou 10K, la taille de l'échantillon est trop petit pour être en mesure de tirer des conclusions tangibles. A 100K, vous regardez toujours le 1/2 second region on this graph. Si vous êtes toujours préoccupé par les performances, regardez le two options for a randomized number I provided in this answer. Nous n'avons pas vos données ou configuration, donc il vous appartient de tester réellement la situation. Il existe de nombreuses pages sur la façon de calculer le temps écoulé en PHP - créer deux pages, une en utilisant shuffle et l'autre en utilisant la requête RAND(). Exécuter au moins 10 de chaque, & jeter un oeil.

+0

merci, j'ai effectivement lu ce fil plusieurs fois avant de poster cette question. – Gal

1

Je regarde cela par expérience avec MySQL.

Parlons-en sur le premier morceau de code:

$r = $db->query("select * from table"); 
for($i=0;$i<500;$i++){ 
    $arr[$i] = mysqli_fetch_assoc($r); 
} 
shuffle($arr); 

Il est clair qu'il serait plus efficace de limiter le nombre de lignes dans l'instruction SQL au lieu de le faire sur PHP.

Ainsi:

$r = $db->query("SELECT * FROM table LIMIT 500"); 
while($arr[] = mysqli_fetch_assoc($r)){} 
shuffle($arr); 

opération SQL serait plus rapide que de le faire en PHP, surtout quand vous avez une telle grande quantité de lignes. Une bonne façon de le savoir est de faire des analyses comparatives et de savoir lequel des deux serait le plus rapide. Mon pari est que le SQL serait plus rapide que le shuffling en PHP.

Donc, mon vote va pour:

$r = $db->query("SELECT * FROM table ORDER BY RAND() LIMIT 500"); 
while($arr[] = mysqli_fetch_assoc($r)){} 
+1

RAND() n'est pas évolutif .. une fois que vous avez atteint des milliers de lignes, il ralentit énormément. –

+0

merci! et j'ai vu cette erreur que vous avez mentionnée et corrigée. – Gal

+1

Cependant, entre shuffle et RAND(), RAND() est nettement meilleur que shuffle .. – mauris