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

Bonne/Mauvaise idée ? Utiliser MySQL RAND() en dehors d'un petit ensemble de résultats de sous-requête ?

En fait... j'ai fini par faire un test et j'aurais peut-être répondu à ma propre question. Je pensais poster cette information ici au cas où elle serait utile à quelqu'un d'autre. (Si j'ai fait quelque chose de mal ici, faites-le moi savoir !)

C'est un peu surprenant...

Contrairement à tout ce que j'ai lu, j'ai créé une table appelée TestData avec 1 million de lignes et j'ai exécuté la requête suivante :

SELECT * FROM TestData WHERE nombre =41 ORDER BY RAND() LIMIT 8

... et il a renvoyé les lignes en 0,0070 seconde en moyenne. Je ne vois pas vraiment pourquoi RAND() a une si mauvaise réputation. Cela me semble assez utilisable, du moins dans cette situation particulière.

J'ai trois colonnes dans mon tableau :

identifiant [BIGINT(20)] | champ de texte [tinytext] | nombre [BIGINT(20)]

Clé primaire sur l'identifiant, index sur le numéro.

Je suppose que MySQL est assez intelligent pour savoir qu'il ne devrait appliquer RAND() qu'aux 20 lignes renvoyées par "WHERE number =41" ? (J'ai spécifiquement ajouté seulement 20 lignes qui avaient la valeur 41 pour 'nombre'.)

La méthode de sous-requête alternative renvoie des résultats avec un temps moyen d'environ 0,0080 seconde, ce qui est plus lent que la méthode sans sous-requête.

Méthode de sous-requête :SELECT * FROM (SELECT * FROM TestData WHERE nombre =41) as t ORDER BY RAND() LIMIT 8