2010-03-04 6 views
0
$offset = SELECT FLOOR(RAND() * COUNT(*)) FROM t_table 
SELECT * FROM t_table WHERE LIMIT $offset,1 

Cela fonctionne très bien dans myisam mais je voudrais changer cette table pour InnoDB (toutes les autres tables db sont InnoDB) pour profiter des avantages des clés-étrangers et éviter la table verrouillage de niveau.optimisation aléatoire de requête de ligne dans la table InnoDB

Le champ primaryId de ce tableau est un VARCHAR (10)

Je ne peux pas "forcer" un autoinc identifiant numérique, car les enregistrements sont supprimés/ajoutés tout le temps et RANDOM (MIN (Id), La prédiction MAX (Id)) manquerait probablement beaucoup de lignes.

comment puis-je optimiser cette requête à innodb?

Merci d'avance!
Arthur

Répondre

0

Cela ne fonctionne pas pour vous?

SELECT * FROM t_table ORDER BY RAND() LIMIT 1 
+0

C'était ma première tentative, mais la table est devenue plus grande et j'ai dû le remplacer par la question sur la question – arthurprs

0

"SELECT * DÉCRET t_table PAR RAND() LIMIT 1"

Cela ne fonctionnera pas, car mySQL vérifiera toutes les lignes qui correspondent à la condition (aucune condition ici, donc prendra toutes les lignes) ils vont copier les lignes dans une table temporaire, puis sélectionner une ligne aléatoire