PROJET AUTOBLOG


Shaarli - le hollandais volant

Site original : Shaarli - le hollandais volant

⇐ retour index

Anton Titov’s blog » “Do not use ORDER BY RAND()” or “How to get random rows from table?”

jeudi 17 mars 2016 à 18:10
C’est censé ce qu’il dit :

« Let’s say you run this query on a table with 10000 rows, than the SQL server generates 10000 random numbers, scans this numbers for the smallest one and gives you this row »

En gros : n’utilisez pas ORDER BY RAND() en SQL.
SQL va associer un nombre aléatoire, généré pour l’occasion, à chaque entrée de la table, et ensuite prendre le plus petit.
Il y a donc plusieurs opérations : la génération d’autant de nombres aléatoires que d’entrées dans la base, leur tri en ordre croissant et la réponse.

C’est écrit dans l’article, mais la solution à retenir est plutôt de lister le nombre d’entrées dans la base en SQL, générer un nombre aléatoire en PHP (ou dans le langage que vous utilisez) entre 0 et le nombre d’entrées, puis repasser en SQL et sortir l’entrée correspondant à ce nombre. Oui, ça fait deux requêtes, mais c’est beaucoup plus rapide quand même.

Idem pour N entrées : listez les ID des entrées en SQL, utilisez PHP (ou autre) pour en prendre N au hasard, puis utilisez SQL pour les sortir de la base.

En revanche, si votre base fait N entrées et que vous voulez mélanger ces N entrées, je ne vois pas d’inconvénients à utiliser RAND(). Je ne suis pas sûr qu’un array_shuffle() en PHP (ou équivalent) soit plus performant. Dans le cas présent, RAND() est prévu pour ça.

(Je n’ai pas de benchmarks par contre)
— (permalink)