Sebbene non esista un "ordine rapido per rand()", esiste una soluzione alternativa per la tua attività specifica.
Per ottenere una singola riga casuale , puoi fare come fa questo blogger tedesco:http://web.archive.org/web/20200211210404/http://www.roberthartung.de/mysql-order-by-rand-a- studio di casi di alternative/ (Non ho potuto vedere l'URL di un hotlink. Se qualcuno ne vede uno, sentiti libero di modificare il link.)
Il testo è in tedesco, ma il codice SQL è un po' in fondo alla pagina e in grandi riquadri bianchi, quindi non è difficile da vedere.
Fondamentalmente quello che fa è creare una procedura che svolga il lavoro di ottenere una riga valida. Ciò genera un numero casuale compreso tra 0 e max_id, prova a recuperare una riga e, se non esiste, continua fino a quando non ne trovi uno che lo fa. Consente di recuperare un numero x di righe casuali memorizzandole in una tabella temporanea, quindi probabilmente puoi riscrivere la procedura in modo che sia un po' più veloce recuperando solo una riga.
Lo svantaggio di questo è che se elimini MOLTE righe e ci sono enormi lacune, è molto probabile che manchi un sacco di volte, rendendolo inefficace.
Aggiornamento:tempi di esecuzione diversi
Potrebbe avere a che fare con l'indicizzazione. id
è indicizzato e di rapido accesso, mentre si aggiunge username
al risultato, significa che deve leggerlo da ogni riga e inserirlo nella tabella di memoria. Con il *
deve anche leggere tutto in memoria, ma non ha bisogno di saltare il file di dati, il che significa che non c'è tempo perso nella ricerca.
Questo fa la differenza solo se ci sono colonne di lunghezza variabile (varchar/text), il che significa che deve controllare la lunghezza, quindi saltare quella lunghezza, invece di saltare semplicemente una lunghezza impostata (o 0) tra ogni riga.