MISE À JOUR 2016
Cette solution fonctionne mieux avec une colonne indexée .
Voici un exemple simple et un banc de requête optimisé marqué de 100 000 lignes.
OPTIMISÉ :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
remarque sur le montant limite :limite 4 et 4/compte(*). Les 4 doivent être le même nombre. Changer le nombre de retours n'affecte pas beaucoup la vitesse. La référence à la limite 4 et la limite 1000 sont les mêmes. La limite de 10 000 a pris jusqu'à 600 ms
remarque sur l'adhésion :Randomiser uniquement l'identifiant est plus rapide que randomiser une ligne entière. Puisqu'il doit copier la ligne entière dans la mémoire, la randomiser. La jointure peut être n'importe quelle table liée à la sous-requête Son pour empêcher les balayages de table.
notez la clause where :Le nombre de points limite le nombre de résultats randomisés. Il prend un pourcentage des résultats et les trie plutôt que l'ensemble du tableau.
noter la sous-requête :Les conditions if doing joins et extra where clause vous devez les mettre à la fois dans la sous-requête et la sous-sous-requête. Pour avoir un décompte précis et extraire des données correctes.
NON OPTIMISÉ :1 200 ms
SELECT
g.*
FROM
table g
ORDER BY RAND()
LIMIT 4
AVANTAGES
4x plus rapide que order by rand()
. Cette solution peut fonctionner avec n'importe quelle table avec une colonne indexée.
CONS
C'est un peu complexe avec des requêtes complexes. Nécessité de maintenir 2 bases de code dans les sous-requêtes