2011-11-02 4 views
0

J'ai quelques problèmes pour trouver un indice de travailler pour cette requête (générée par MicroStrategy):Index MySQL Optimisation pour Microstrategy

SELECT  a11.method method, sum(a11.call_count) CALLCOUNT 
FROM call_facts  a11 
    JOIN dimension a12 ON (a11.user_id = a12.user_id) 
    JOIN service a13 ON (a11.service_id = a13.service_id) 
WHERE (a12.is_fraudulent = 0 
    AND a12.is_test_account = 0 
    AND a13.in_directory in ('yes') 
    AND a11.date > '2011-10-01') 
GROUP BY a11.method; 

J'ai actuellement des indices sur a12.is_fraudulent et a12.is_test_account. Expliquer montre une fusion d'index utilisant ces deux. A11 et A13 sont tous les deux bons avec des indices. Quel index puis-je créer pour accélérer un peu cette requête? A titre de référence, a12 a environ 8 M entrées, 7,4 correspondent à is_test_account = 0 and is_fraudulent = 0 cas.

+0

Pourquoi vous avez a13.in_directory dans (« oui ») au lieu de a13.in_directory = « oui »? –

+0

La requête est générée par certains logiciels utilisés par mon équipe Business Analytics. Je ne peux pas modifier la requête, donc j'essaie d'optimiser les indices autant que possible pour augmenter les performances. En ce moment, cette requête prend environ 2 heures à courir. – Jericon

+0

Merci pour l'explication. –

Répondre

0

Les index composés donnent généralement de meilleures performances que les index multiples à colonne unique combinés dans un index-merge optimization.

Il serait utile d'inclure le rapport EXPLAIN actuel pour la requête lorsque vous demandez de l'aide pour une requête.

Il serait également utile d'afficher la pleine DDL (SHOW CREATE TABLE) pour chaque table, parce que « a11 et a13 sont tous les deux bien avec des indices » est probablement pas vrai, et nous donne aucune information sur ce index que vous avez défini dans ces tableaux.

Si je dois faire une supposition, je voudrais essayer:

ALTER TABLE call_facts ADD INDEX (method, date, call_count); 

ALTER TABLE dimension ADD INDEX (user_id, is_fraudulent, is_test_account); 

ALTER TABLE service ADD INDEX (service_id, in_directory);