2010-03-03 6 views
4

Pour autant que je sache, mysql n'utilise pas index si vous utilisez des requêtes IN (1, 2 ... n). Ai-je tort? Ou y at-il quelque chose que je pourrais faire pour que mysql l'utilise? Je ne parle pas d'optimisation de la sous-requête IN() car cela est clairement expliqué dans le manuel.Optimisation de requête IN (1, 2 ... n)

Exemple (en supposant qu'il existe un index sur tous les champs, nommé index_abc):

WHERE a = 1 AND b = 2 AND c = 3 - il utilise index_abc

WHERE a = 2 AND b IN (2, 4, 5) AND C = 3 - il ne

Merci d'avance pour votre aide .

+4

EXPLAIN est votre ami: http://dev.mysql.com/doc/refman/5.0/fr/explain.html –

+1

Si je n'ai pas utilisé expliquer, comment pourrais-je écrire en toute confiance sur les situations où il utilise des index et quand ça ne marche pas ... D'apprendre le manuel par cœur? Ne sois pas stupide. La logique est aussi ton ami. – shazarre

+1

Pouvez-vous poster les résultats de l'EXPLAIN pour les deux requêtes pour toute personne intéressée. –

Répondre

3

Qu'est-ce qui détermine l'origine des valeurs de votre expression IN? Les chances sont que ce soit l'entrée de l'utilisateur, ou quelque chose que devrait être dans une table quelque part. Des exemples de choses qui devraient figurer dans une table incluent des valeurs de recherche codées en dur. Même l'entrée de l'utilisateur peut d'abord être insérée dans une table quelque part. Ensuite, vous pouvez utiliser un JOIN plutôt qu'un IN et vos index fonctionneront très bien.

+0

Ces valeurs sont évaluées dans l'application. Mais c'est sûrement un moyen - de savoir s'il est possible de les évaluer en utilisant sql. Merci pour votre suggestion. – shazarre

2

here sont décrits tous les cas où MySQL peut utiliser des index. Je n'ai pas vu dedans. réécrire votre requête à (b = 2 OR b = 4 OR b = 5) AND c = 3 qui devrait faire mysql à utiliser l'index. Je pense que c'est juste parce que mysql n'est pas assez intelligent :)

+0

Je vais essayer, merci :) – shazarre

0

La publication de votre explication serait vraiment utile. Essayez d'ajouter FORCE KEY (keyname) dans votre requête pour voir si elle a résolu votre problème.

1

Je suis d'accord avec Joel. Essayez d'éviter les instructions IN lorsque cela est possible.

(Dans la plupart des cas, ils peuvent être remplacés par JOINS.) L'utilisation des instructions IN est un inconvénient de performance connu. Sachez également que les instructions IN ont un nombre maximum de membres autorisés sur (la plupart des) bases de données.