2010-09-04 6 views
5

Si j'écris cette requête,index MySQL ne contribue pas à IN

EXPLAIN SELECT * FROM `smth` WHERE d_id = 9 

il vérifie une ligne instantanément. Mais quand j'utilise IN, par exemple

EXPLAIN SELECT * FROM `smth` WHERE d_id IN (9, 3) 

il vérifie toutes les lignes. Que devrais-je faire au lieu de IN si l'index n'y aide pas?

+0

oui je suis très curieux de connaître la réponse aussi –

+0

Pourquoi penses-tu qu'elle vérifie toutes les lignes? Pouvez-vous poster la sortie des SELECT EXPLAIN? –

+0

Peut-être d'intérêt: http://stackoverflow.com/questions/586381/mysql-not-using-indexes-with-where-in-clause – Fionnuala

Répondre

7

MySQL 5.1 a un type de jointure range qui optimise les prédicats IN. Cependant, l'optimiseur de MySQL peut avoir déterminé que votre colonne d_id contient les valeurs 9 et 3 dans une si grande majorité de lignes qu'il a décidé qu'il serait moins cher de lire toute la table que de lire l'index, puis le table. Par analogie, si vous lisez un livre et que vous voulez trouver chaque page qui contient le mot «le», allez-vous à l'index à la fin du livre, cherchez «le» et retournez à chaque page à son tour? Ou voulez-vous simplement lire la couverture du livre à couvrir parce que presque chaque page est garantie d'avoir ce mot là-dessus?

+2

C'était en fait une superbe explication. Je viens d'insérer beaucoup de lignes et j'ai essayé d'utiliser IN à nouveau et maintenant il ne vérifie que quelques lignes pas toutes. Merci. –

1

C'est probablement parce que votre table ne contient pas beaucoup de lignes. Si votre table contenait plus de lignes, elle utiliserait probablement l'index. Voici un exemple d'une table avec un million de lignes:

 
EXPLAIN SELECT * FROM table1 WHERE x = 9; 
1, 'SIMPLE', 'table1', 'const', 'PRIMARY', 'PRIMARY', '4', 'const', 1, '' 

EXPLAIN SELECT * FROM table1 WHERE x IN (9, 3); 
1, 'SIMPLE', 'table1', 'range', 'PRIMARY', 'PRIMARY', '4', '', 2, 'Using where' 

Dans les deux cas, l'index de clé primaire est utilisé.