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

MySQL:alternative a ORDER BY RAND()

AGGIORNAMENTO 2016

Questa soluzione funziona al meglio utilizzando una colonna indicizzata .

Ecco un esempio semplice e ottimizzato di query bench contrassegnato da 100.000 righe.

OTTIMIZZATO:300 ms

SELECT 
    g.*
FROM
    table g
        JOIN
    (SELECT 
        id
    FROM
        table
    WHERE
        RAND() < (SELECT 
                ((4 / COUNT(*)) * 10)
            FROM
                table)
    ORDER BY RAND()
    LIMIT 4) AS z ON z.id= g.id

nota sull'importo limite :limite 4 e 4/conteggio(*). I 4 devono essere lo stesso numero. Cambiare quanti ne restituisci non influisce molto sulla velocità. Il benchmark al limite 4 e al limite 1000 sono gli stessi. Il limite 10.000 ha richiesto fino a 600 ms

nota sull'adesione :randomizzare solo l'id è più veloce che randomizzare un'intera riga. Dal momento che deve copiare l'intera riga in memoria, quindi randomizzarla. Il join può essere qualsiasi tabella collegata alla sottoquery Its per impedire la scansione delle tabelle.

nota dove clausola :Il conteggio where limita la quantità di risultati che vengono randomizzati. Prende una percentuale dei risultati e li ordina invece dell'intera tabella.

sottointerrogazione nota :Se si eseguono join e condizioni extra where, è necessario inserirle sia nella sottoquery che nella sottoquery. Per avere un conteggio accurato e recuperare i dati corretti.

NON OTTIMIZZATO:1200 ms

SELECT 
    g.*
FROM
    table g
ORDER BY RAND()
LIMIT 4

PRO

4 volte più veloce di order by rand() . Questa soluzione può funzionare con qualsiasi tabella con una colonna indicizzata.

CONS

È un po' complesso con query complesse. Necessità di mantenere 2 basi di codice nelle sottoquery