2011-01-15 2 views
0

J'ai deux questions ici mais je leur demande à la fois car je pense qu'ils sont interdépendants.Optimisation d'une requête complexe dans mysql

Je travaille avec une requête complexe (jointures multiples + sous-requêtes) et la table est assez grande aussi (environ 2 000 000 enregistrements dans cette table).

Une partie de cette requête (une LEFT JOIN) est nécessaire pour trouver un enregistrement qui a une deuxième valeur la plus basse dans une colonne cetain parmi tous les enregistrements associés à la clé primaire de la première table. Pour l'instant j'ai isolé cette partie et la réflexion sur les lignes de -

SELECT id FROM tbl ORDER BY `myvalue` ASC LIMIT 1,1; 

Mais il y a un cas où, s'il n'y a que 1 enregistrement de la table, il doit retourner cet enregistrement au lieu de NULL. Donc, ma première question est de savoir comment écrire une requête pour cela? Deuxièmement, compte tenu de la taille de la table et du temps qu'il faut déjà pour exécuter même après avoir créé des index, je comprends que l'ajout de plus de complexité pour atteindre la partie ci-dessus pourrait affecter considérablement le temps d'interrogation.

Je ne peux pas se décomposer rejoint parce que je dois obtenir quelques-unes des colonnes de la clause ORDER BY (l'application dispose d'une option pour trier le résultat par ces colonnes, la colonne ci-dessus « de myvalue » étant l'un d'entre eux)

Quel serait le (s) moyen (s) d'aborder ce problème?

Merci

Répondre

0

Quelque chose comme cela pourrait fonctionner

COALESCE(
    (SELECT id FROM tbl ORDER BY `myvalue` ASC LIMIT 1,1), 
    (SELECT id FROM tbl ORDER BY `myvalue` ASC LIMIT 0,1)) 

Il sélectionne la première valeur non nulle dans la liste fournie. En ce qui concerne la complexité de la requête, postez le tout afin que nous puissions y jeter un coup d'œil.

+0

qui a fonctionné. Merci beaucoup. J'ai également réussi à améliorer les performances de la requête dans une certaine mesure après avoir ajouté cela. Donc, tout est bon pour le moment. – naiquevin