2010-03-09 3 views
2

je suis une base de données d'interroger comme ceci:MySQL n'utilise pas les clés de la requête externe d'une sous-sélection avec « IN »

SELECT * from Log WHERE cookieId IN (select cookieId from Log WHERE someId="blafasel"); 

Je touches someId et cookieId mais encore la requête est très lent. Si je cours les deux requêtes (l'extérieur et l'intérieur) les séparent tous les deux ou très rapidement.

select cookieId from Log WHERE someId="blafasel" 

me obtient les résultats presque instantanés. Et fait donc une requête

SELECT * FROM Log WHERE cookieId IN ("something","somethingelse","athirdoption") 

avec EXPLAIN me dit que les clés sont utilisées dans les deux requêtes simples mais pour les touches de requête subselect ne sont utilisées que pour la sélection intérieure. Ma question est pourquoi? Et comment dire à MySQL d'être un peu plus intelligent.

Eh bien, je pourrais laisser mon application exécuter les deux requêtes séparées, mais ce ne serait pas pratique.

Merci pour votre aide.

Répondre

7

Avez-vous essayé d'utiliser

SELECT l.* 
FROM log l INNER JOIN 
     log ls ON l.cookieid = ls.cookieid 
WHERE ls.someId="blafasel" 
+2

J'étais juste un peu plus lent, donc je supprimé ma réponse indiquant la même chose et vous avez voté au lieu: p. – wimvds

+1

Nice, je vais utiliser cela pour améliorer certaines de mes requêtes SQL. –

0

Avez-vous essayé simplement cela? J'imagine que votre vraie requête est un peu différente, mais juste au cas où ce n'est pas le cas.

Également, n'explique pas afficher la clé correcte dans la colonne "clés possibles"? Si c'est le cas, vous pouvez essayer d'utiliser une clause "force index (index_name)" sur la sélection externe pour voir si cela l'accélère.

Questions connexes