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()
.
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
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