Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL :Alternatives à ORDER BY RAND()

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