Est-il possible de sélectionner par plage sur plusieurs index gauche?
-
30-09-2019 - |
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.
La solution
- Non, ce n'est pas.
- 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).