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