Mysql
 sql >> Database >  >> RDS >> Mysql

Selezione casuale più veloce DOVE la colonna X è Y (NULL)

Ottenere un record davvero casuale può essere lento. Non c'è davvero molto da aggirare su questo fatto; se vuoi che sia veramente casuale, la query deve caricare tutti i dati rilevanti per sapere da quali record deve scegliere.

Fortunatamente, tuttavia, ci sono modi più rapidi per farlo. Non sono propriamente casuali, ma se sei felice di scambiare un po' di pura casualità con velocità, allora dovrebbero essere abbastanza buoni per la maggior parte degli scopi.

Con questo in mente, il modo più veloce per ottenere un record "casuale" è aggiungere una colonna extra al tuo DB, che è popolato con un valore casuale. Forse un hash MD5 salato della chiave primaria? Qualunque. Aggiungi gli indici appropriati su questa colonna, quindi aggiungi semplicemente la colonna al tuo ORDER BY clausola nella query e riavrai i tuoi record in un ordine casuale.

Per ottenere un singolo record casuale, specifica semplicemente LIMIT 1 e aggiungi un WHERE random_field > $random_value dove valore casuale sarebbe un valore nell'intervallo del tuo nuovo campo (ad esempio, un hash MD5 di un numero casuale).

Ovviamente il lato negativo qui è che sebbene i tuoi record siano in un ordine casuale, rimarranno bloccati nello stesso ordine casuale. Ho detto che era la perfezione scambiata per la velocità delle query. Puoi aggirare il problema aggiornandoli periodicamente con nuovi valori, ma immagino che potrebbe essere un problema per te se devi mantenerlo aggiornato.

L'altro lato negativo è che l'aggiunta di una colonna in più potrebbe essere troppo da chiedere se hai vincoli di archiviazione e il tuo DB ha già dimensioni enormi o se hai un DBA rigoroso da superare prima di poter aggiungere colonne. Ma ancora una volta, devi scambiare qualcosa; se vuoi la velocità della query, hai bisogno di questa colonna extra.

Comunque, spero di esserti stato d'aiuto.