Question

J'ai un m_idx index sur (k1,k2,k3)
Si je fais
SELECT c1,c2,c3... FROM tb FORCE INDEX (m_idx) WHERE k1=500 AND k2 IN(...) AND k2>2000 ORDER BY k1 LIMIT 1000;
OU
SELECT c1,c2,c3... FROM tb FORCE INDEX (m_idx) WHERE k1 IN (500,1000,1500 ...) AND k2 IN(...) AND k2>2000 ORDER BY k1 LIMIT 1000;
Handler_read_next = 999

mais si je tente d'utiliser une gamme de k1:
SELECT c1,c2,c3... FROM tb FORCE INDEX (m_idx) WHERE k1>=500 AND k2 IN(...) AND k2>2000 ORDER BY k1 LIMIT 1000;
Handler_read_next = 58035
Dans tous les cas EXPLIQUER dit que la clé utilisée est m_idx
Mais je pense que dans le troisième cas m_idx ce n'est pas utilisé (j'ai aussi un indice que sur k1).
Sinon, je ne comprends pas pourquoi IT'IS lire plus de 1000 lignes.
Je me attendais à balayage de l'index m_idx et les lignes de ONLY the first 1000 qui remplissent les conditions pour être lues à partir du tableau.
Mais en fait, je pense que pour le troisième cas, il scanne l'index et les lignes qui rencontrent état k1 sont lues à partir du tb et conditions K2 et K3 sont vérifiés après les lignes sont lues à partir tb.
J'utiliser: MySql avec MyISAM, WINDOWS 7 64, la tb a 1 rangées de mil;
Mes questions sont les suivantes:
Est-il possible de sélectionner par plage sur plusieurs index gauche?
OU
Je fais quelque chose de mal d'autre?
Merci.

Était-ce utile?

La solution

  1. Non, ce n'est pas.
  2. Non, vous faites tout droit

http://dev.mysql.com/doc/ refman / 5.1 / fr / gamme optimization.html ( "7.3.1.3.2. La Méthode d'accès pour plusieurs parties Index" partie)

Vous ne pouvez pas optimiseur d'aide pour effectuer cette requête plus rapide.

et évitez d'utiliser FORCE INDEX, car optimiseur sait mieux ce que l'indice d'utilisation.

Aussi:

k1>=500 AND k2 IN(...) AND k2>2000

En fonction de quelle partie le rendement moins d'enregistrements, soit k1>=500 ou k2 IN(...) AND k2>2000 (je ne sais pas pourquoi vous avez besoin > 2000 ici, en raison de vous pouvez comparer manuellement, avant de l'ajouter à IN()), vous pouvez également essayer de créer un index k2 (si le rendement k2 partie moins nombre d'enregistrements).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top