Cela devrait vous aider. Réécrivez votre requête comme suit :
SELECT c1, Sum(c2)
FROM table
WHERE c4 = 2011
AND c5 = 0
AND c6 In (6,9,11)
AND c3 IS NOT NULL
GROUP BY c1
Créez maintenant un index composite sur les colonnes (c4, c5, c6) avec les colonnes DANS CET ORDRE. Les colonnes de votre index doivent apparaître dans le même ordre que les colonnes de votre clause WHERE. Sinon, l'index ne fonctionnera pas. La sélectivité de cet index est suffisamment étroite pour qu'un tri de fichiers sur la table temporaire (pour le group by) soit rapide.
La raison de déplacer c3 à la fin de la requête est la suivante. A titre d'exemple, supposons que c3 peut prendre des valeurs entre 0 et 100 (ou il peut être NULL). Si vous exécutez une requête "IS NOT NULL", alors Mysql doit parcourir presque tout l'index B-Tree à l'exception des arêtes qui correspondent à NULL. Par conséquent, MySQL décide qu'une analyse complète de la table est une option plus facile que de parcourir tous les différents chemins de l'index. D'un autre côté, vous verrez que si votre requête était un "IS NULL" et que votre index était (c3, c4, c5, c6) alors Mysql utilisera en fait cet index. En effet, dans ce cas, Mysql n'a besoin de parcourir que la partie de l'arbre d'index correspondant à la valeur NULL.
Le type d'index dont MySQL a besoin dépend beaucoup de la requête en question. Créer des index sur toutes les colonnes, comme @louis l'a suggéré, n'est PAS une bonne idée !