MySQL ORDER BY RAND()
est un moyen simple d'obtenir des entrées aléatoires dans une base de données. Cependant, la récupération de plusieurs lignes aléatoires à l'aide de cette méthode devient extrêmement lente, en particulier avec de grands ensembles de données.
Considérez cette requête visant à sélectionner 18 profils d'utilisateurs aléatoires :
<code class="language-sql">SELECT u.id, p.photo FROM users u, profiles p WHERE p.memberid = u.id AND p.photo != '' AND (u.ownership=1 OR u.stamp=1) ORDER BY RAND() LIMIT 18</code>
L'inefficacité provient du besoin inhérent de ORDER BY RAND()
de trier l'ensemble des résultats avant d'appliquer la clause LIMIT
.
Une approche plus efficace
Une stratégie supérieure utilise une colonne indexée pour accélérer considérablement la sélection aléatoire. Voici une requête optimisée :
<code class="language-sql">SELECT g.* FROM table g JOIN (SELECT id FROM table WHERE RAND() < (SELECT 4 / COUNT(*) ) * 10 LIMIT 4) AS subquery ON g.id = subquery.id;</code>
Explication des optimisations
Cette requête révisée intègre plusieurs améliorations clés :
RAND()
par rapport à un pourcentage du total des lignes. L'indexation de la colonne id
(ou de la colonne utilisée dans la clause WHERE
) permet une identification rapide des lignes.LIMIT
dans la sous-requête (4) et dans la requête globale doit être identique.WHERE
conditions que la requête principale, garantissant l'intégrité des données.Cette méthode réduit considérablement le temps d'exécution des requêtes, même avec des tables volumineuses, offrant une solution beaucoup plus évolutive pour récupérer plusieurs résultats aléatoires.
Conclusion
Ces techniques d'optimisation offrent une amélioration substantielle des performances lors de la sélection aléatoire de données dans MySQL. En évitant ORDER BY RAND()
, vous pouvez créer des applications de base de données plus efficaces et plus robustes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!