2009-05-12 12 views
6

È più veloce per randomizzare l'ordinamento di un ampio set di risultati sul server MySQL o dopo aver ricevuto i dati in PHP?Più veloce per randomizzare molti risultati su MySQL Server o in PHP

Qualcuno ha dati per eseguire il backup di entrambi i lati, o addirittura un'esperienza aneddotica?

+1

Proverei a dimostrare se un problema esiste in entrambi i modi, prima di preoccuparmene. Dovresti avere un'enorme quantità di dati prima che sia importante, mi aspetto. In effetti, sarebbe interessante confrontare la quantità di tempo che hai impiegato per postare questo e digerire le risposte, rispetto alla scelta di un approccio, all'implementazione, al passaggio e al confronto. (Solo speculazioni, non una critica, facciamo tutti questi esercizi mentali.) – dkretz

+0

sì, ma se qualcuno risponde bene a questa domanda, allora imparerò senza tutto questo investimento di tempo, e io e altri possiamo migliorare il loro codice. Penso che sia una buona domanda da chiedere indipendentemente dal fatto che esista un problema. – nickf

risposta

5

La mia ipotesi istruita è che MySQL vince a mani basse. È fatto per gestire i dati in questo modo. Il semplice sovraccarico di dover spostare tutti i dati su PHP per l'ordinamento offre un vantaggio all'avvio.

Si può scoprire da soli facendo alcuni benchmarking, naturalmente.

+0

Concordo sul fatto che questa sia la risposta probabile, ma al momento non riesco a fare il punto di riferimento, non penso di avere abbastanza dati al momento, ma lo vedo come un problema nel prossimo futuro. – UnkwnTech

1

L'utilizzo di RAND() in MySQL sarà sicuramente essere più veloce.

Per randomizzare tramite PHP, è necessario interrogare il db e inserire i dati in memoria, quindi è necessario un ulteriore passaggio aggiuntivo per aggiungere un sovraccarico al processo di ordinamento.

In MySQL, questo tipo di query non sarà veloce come l'ordine per un valore indicizzato, ma sarà comunque ottimizzato.

0

Nota che utilizzi rand() come l'oggetto dell'ordine da parte di dichiarazione:

select * from foo_table order by rand() limit 100 
4

Di sicuro si dovrebbe fare sul MySQL lato.

ma nota che ORDER BY RAND() è molto inefficiente MySQL poiché richiede filesort.

vedere come selezionare 10 file casuali in modo efficiente con una sola scansione di tabella:

SELECT * 
FROM (
     SELECT @cnt := COUNT(*) + 1, 
       @lim := 10 
     FROM t_random 
     ) vars 
STRAIGHT_JOIN 
     (
     SELECT r.*, 
       @lim := @lim - 1 
     FROM t_random r 
     WHERE (@cnt := @cnt - 1) 
       AND RAND() < @lim/@cnt 
     ) i 

si veda questo articolo nel mio blog per i dettagli delle prestazioni:

Per un 1,000,000 tabella dei record, viene eseguita in meno di un secondo anziché 15 secondo ds utilizzando ORDER BY RAND().

Problemi correlati