Pourquoi n'est-ce pas MySQL à l'aide de l'une de ces clés possibles?
J'ai la requête suivante:
SELECT t.id
FROM account_transaction t
JOIN transaction_code tc ON t.transaction_code_id = tc.id
JOIN account a ON t.account_number = a.account_number
GROUP BY tc.id
Quand je fais un EXPLAIN
la première ligne montre, entre autres choses, ceci:
table: t
type: ALL
possible_keys: account_id,transaction_code_id,account_transaction_transaction_code_id,account_transaction_account_number
key: NULL
rows: 465663
Pourquoi est-clé NULL?
- Vous devez coller ensemble de l'EXPLIQUER de sortie. Par les regards de lui, il n'y a pas de facteur limitant pour la table t, ce qui signifie que votre requête prend toutes les données de la table t, donc pas besoin d'utiliser l'indice que ce soit.
- peut-être que votre requête renvoie toutes les lignes de account_transaction, dans ce cas, une clé peut ne pas être utile.
Vous devez vous connecter pour publier un commentaire.
Il se peut que la statistique est en panne, ou parce qu'il sait que vous avez toujours un ratio de 1:1 entre les deux tables.
Vous pouvez forcer un index pour être utilisé dans la requête, et voir si cela permettrait d'accélérer les choses. Si c'est le cas, essayez d'exécuter ANALYSER la TABLE à assurez-vous que les statistiques sont à jour.
De http://dev.mysql.com/doc/refman/5.1/en/index-hints.html
Un autre problème que vous pouvez rencontrer est un type de données mis-match. Par exemple, si votre colonne est un type de données string (CHAR, par ex), et que votre requête n'est pas en citant un certain nombre, puis MySQL de ne pas utiliser l'index.
Source: Juste combattu cette même question aujourd'hui, et appris à la dure sur MySQL 5.1. 🙂
Edit: informations Complémentaires pour vérifier cela:
Pour l'indice de
group by
(=impliciteorder by
)Le groupe par un implicite de tri sur les tc.id.
tc.l'id n'est pas listé une clé possible.
mais t.l'identificateur de la transaction est.
Modifier le code pour
Cela permettra de mettre à l'indice de potentiel
transaction_code_id
en vue.Index pour les jointures
Si le joint (presque) entièrement joindre les trois tableaux, il n'y a pas besoin d'utiliser l'index, de sorte que MySQL ne fonctionne pas.
D'autres raisons pour ne pas utiliser un index
Si un grand % de lignes en cours d'examen (40% IIRC) sont remplis avec la même valeur. MySQL ne pas utiliser un index. (car pas d'aide de l'index est le plus rapide)