3 votes

Récupérer 50 enregistrements aléatoires d'une table de base de données Mysql (grand ensemble de données)

Je dois extraire un certain nombre d'enregistrements aléatoires d'une table. La table contient environ 100000 les dossiers.

Les enregistrements ne doivent pas être consécutifs et la performance est importante.

J'ai essayé " order by rand() "mais les performances sont mauvaises ( ~3 secondes)

0voto

gnur Points 3464

Vous pourriez essayer de le faire dans une boucle php, mais je doute que ce soit plus rapide

$iMaxID = getMaxIdFromYourTable(); //not real php
$records = array();
while (true) {
    $iRandID = rand(1,$iMaxID);
    thisRecord = "SELECT FROM yourtable WHERE id = $iRandID";
    if (numrows > 0) {
        $records[] = thisRecord;
        if (count($records) > 50) {
            break;
        }
    }
}

0voto

CharlesLeaf Points 2572

J'ai juste lancé une simple SELECT * FROM table ORDER BY RAND() LIMIT 50; sur une table comportant 229 291 lignes. Terminé en 0,63 secondes. Étant donné, que RAND() est vraiment lent et qu'il devrait y avoir une meilleure solution.

Je ne connais qu'un seul autre moyen de sélectionner une ligne aléatoire dans un grand ensemble de données, plus rapide que l'utilisation de la fonction ORDER BY RAND() . qui est expliqué ici : http://wanderr.com/jay/order-by-slow/2008/01/30/

Pour les rangées aléatoires multiples, je ne connais pas actuellement de meilleure solution. Si les identifiants sont successifs et qu'aucun identifiant ne manque entre eux, vous pouvez générer une liste de nombres aléatoires séparés par des virgules dans votre propre code PHP - et ensuite, en utilisant la fonction SELECT * FROM table WHERE id IN(5,3,1); requête.

Voici une solution qui fonctionne, dans une autre question de Stack Overflow : Comment puis-je optimiser la fonction ORDER BY RAND() de MySQL ?

Cela a fonctionné pour moi, 50 lignes dans le jeu (0,09 sec) pour la table avec 229 291 enregistrements.

0voto

BlueMonkMN Points 10838
SET @o = (SELECT FLOOR(RAND() * COUNT(*)) FROM your_table);
PREPARE STMT FROM 'SELECT * FROM your_table LIMIT ?, 1';
EXECUTE STMT USING @o;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X