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

Sélection aléatoire la plus rapide OÙ la colonne X est Y (NULL)

Obtenir un enregistrement véritablement aléatoire peut être lent. Il n'y a pas vraiment grand-chose pour contourner ce fait; si vous voulez qu'elle soit vraiment aléatoire, la requête doit charger toutes les données pertinentes afin de savoir dans quels enregistrements elle doit choisir.

Heureusement cependant, il existe des moyens plus rapides de le faire. Ils ne sont pas vraiment aléatoires, mais si vous préférez échanger un peu de pur hasard contre de la vitesse, ils devraient suffire dans la plupart des cas.

Dans cet esprit, le moyen le plus rapide d'obtenir un enregistrement "aléatoire" consiste à ajouter une colonne supplémentaire à votre base de données, qui est remplie avec une valeur aléatoire. Peut-être un hachage MD5 salé de la clé primaire ? Peu importe. Ajoutez les index appropriés sur cette colonne, puis ajoutez simplement la colonne à votre ORDER BY clause dans la requête, et vous récupérerez vos enregistrements dans un ordre aléatoire.

Pour obtenir un seul enregistrement aléatoire, spécifiez simplement LIMIT 1 et ajoutez un WHERE random_field > $random_value où la valeur aléatoire serait une valeur dans la plage de votre nouveau champ (disons un hachage MD5 d'un nombre aléatoire, par exemple).

Bien sûr, l'inconvénient ici est que même si vos enregistrements seront dans un ordre aléatoire, ils seront bloqués dans le même ordre aléatoire. J'ai bien dit qu'il s'agissait d'échanger la perfection contre la vitesse des requêtes. Vous pouvez contourner ce problème en les mettant à jour périodiquement avec de nouvelles valeurs, mais je suppose que cela pourrait être un problème pour vous si vous avez besoin de le garder à jour.

L'autre inconvénient est que l'ajout d'une colonne supplémentaire peut être trop demander si vous avez des contraintes de stockage et que votre base de données est déjà massive, ou si vous avez un DBA strict à passer avant de pouvoir ajouter des colonnes. Mais encore une fois, vous devez échanger quelque chose; si vous voulez la vitesse de requête, vous avez besoin de cette colonne supplémentaire.

Quoi qu'il en soit, j'espère que cela a aidé.