2008-11-13 7 views
0

que je faisais ceci:Pourquoi MySQL n'utilise-t-il pas l'index pour cette sous-requête?

SELECT layerID 
FROM layers 
WHERE ownerID = ? 
AND collectionID = ? 

qui me donnerait un tableau de layerID de, et puis je boucle et le faire pour chacun:

SELECT DATA 
FROM drawings 
WHERE layerID = ? 

Et tout cela a bien fonctionné. Alors maintenant, je suis en train de le faire en une seule étape, donc j'essayer:

SELECT DATA , layerID 
FROM drawings 
WHERE layerID = ANY (
    SELECT layerID 
    FROM layers 
    WHERE ownerID = ? 
    AND collectionID = ? 
) 

Mais pour une raison quelconque, il ne pas utiliser l'index, pour la requête principale, SELECT DATA etc! Donc, cette requête combinée prend beaucoup plus de temps à compléter, par rapport aux requêtes séparées que je faisais auparavant. (Par ailleurs, la sous-requête SELECT layerID etc utilise toujours l'index).

J'ai déterminé s'il utilisait une requête ou non en utilisant l'instruction 'EXPLAIN'.

J'ai des indices individuels sur les colonnes ownerID et collectionID dans le tableau layers, et sur la colonne layerID dans le tableau drawings.

Qu'est-ce que je fais de mal avec ma requête?

Répondre

5

Essayez une jointure. Tout finit par ressembler beaucoup à une UNION non optimisable à l'optimiseur de requête.

SELECT d.DATA, d.layerID 
FROM drawings AS d 
INNER JOIN layers AS l ON d.layerID = l.layerID 
WHERE l.ownerID = ? AND l.collectionID = ? 
+0

Cela l'a fait, merci. Je vais essayer d'éviter d'utiliser des sous-requêtes, et au lieu de pratiquer plus avec des jointures. C'est juste que les sous-requêtes sont plus faciles à comprendre au début. – davr

0

Je n'ai jamais vu le mot clé ANY avant, mais si vous essayez

 
SELECT DATA , layerID 
FROM drawings 
WHERE layerID IN (
    SELECT layerID 
    FROM layers 
    WHERE ownerID = ? 
    AND collectionID = ? 
) 

volonté qui ont le même problème? Je crois que ça ne devrait pas. Cependant, INNER JOIN est probablement un peu mieux.

+0

Je crois que "= ANY" et "IN" font exactement la même chose dans la plupart des cas. – davr

Questions connexes