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

Buona idea/Cattiva idea? Utilizzi MySQL RAND() al di fuori di un piccolo insieme di risultati di sottoquery?

In realtà... ho finito per eseguire un test e potrei aver risposto alla mia stessa domanda. Ho pensato di pubblicare queste informazioni qui nel caso fossero utili a qualcun altro. (Se ho fatto qualcosa di sbagliato qui, per favore fatemelo sapere!)

Questo è un po' sorprendente...

Contrariamente a tutto ciò che ho letto, ho creato una tabella chiamata TestData con 1 milione di righe ed ho eseguito la seguente query:

SELEZIONA * DA TestData DOVE numero =41 ORDINA PER RAND() LIMITE 8

...e ha restituito le righe in una media di 0,0070 secondi. Non vedo davvero perché RAND() abbia una così cattiva reputazione. Mi sembra abbastanza utilizzabile, almeno in questa particolare situazione.

Ho tre colonne nella mia tabella:

id [GRANDE(20)] | campo di testo [testo minuscolo] | numero [BIGINT(20)]

Chiave primaria su id, indice su numero.

Immagino che MySQL sia abbastanza intelligente da sapere che dovrebbe applicare solo RAND() alle 20 righe restituite da "WHERE number =41" ? (Ho aggiunto specificamente solo 20 righe che avevano il valore 41 per 'numero'.)

Il metodo di sottoquery alternativo restituisce risultati con un tempo medio di circa 0,0080 secondi, che è più lento del metodo non di sottoquery.

Metodo di sottoquery:SELECT * FROM (SELECT * FROM TestData WHERE numero =41) as t ORDER BY RAND() LIMIT 8