2010-05-13 9 views
0

J'ai une grande table. composé de seulement 3 colonnes (id (INT), bookmarkID (INT), tagID (INT)) .J'ai deux index BTREE un pour chaque colonne bookmarkID et tagID.Cette table a environ 21 millions d'enregistrements. Je suis en train d'exécuter cette requête:L'exécution d'une requête dans MySql pour utiliser un index spécifique

SELECT bookmarkID,COUNT(bookmarkID) AS count 
FROM bookmark_tag_map 
GROUP BY tagID,bookmarkID 
HAVING tagID IN (-----"tagIDList"-----) AND count >= N 

qui prend les âges pour retourner le results.I lu quelque part que si faire un index dans lequel il a TagId, bookmarkID ensemble, je vais obtenir un résultat beaucoup plus rapide. J'ai créé l'index après un certain temps. J'ai essayé à nouveau la requête, mais il semble que cette requête n'utilise pas le nouvel index que j'ai fait. J'ai couru EXPLAIN et j'ai vu que c'est vrai. Ma question est maintenant comment je peux appliquer une requête pour utiliser un index spécifique? Des commentaires sur d'autres façons de rendre la requête plus rapide sont également les bienvenus. Merci

Répondre

2

Jetez un oeil à la Index Hint Syntax

+0

... et ne les utilisez pas. Ils feront généralement plus de mal que de bien, à moins que vous ne soyez du type à lire un plan de requête et à bien comprendre ce que chacune de ces icônes fait réellement. Si l'optimiseur ne sélectionne pas cet index, c'est souvent pour de bonnes raisons. – JohnFx

3

Tout d'abord, ayant TagId dans le groupe par article, mais pas dans les champs sélectionnés est étrange, parce que vous ne saurez pas quelle balise le compte appartient. Êtes-vous sûr de vouloir que le tagID soit en groupe? Si vous voulez juste les signets les plus fréquents pour certains ensembles de tags, vous n'en avez pas besoin. Ma proposition pour la rendre plus rapide est de déplacer la condition TagId dans la clause where:

SELECT bookmarkID,COUNT(bookmarkID) AS count 
FROM bookmark_tag_map 
WHERE tagID IN (-----"tagIDList"-----) 
GROUP BY bookmarkID 
HAVING count >= N 

Cela devrait être beaucoup plus rapide, mais pour 12 millions de disques sans doute pas encore assez rapide pour l'utiliser sur une page souvent appelée sans mise en cache