To powinno ci pomóc. Przepisz zapytanie w następujący sposób:
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
Teraz utwórz indeks złożony dla kolumn (c4, c5, c6) z kolumnami W TEJ KOLEJNOŚCI. Kolumny w indeksie powinny pojawiać się w tej samej kolejności, co kolumny w klauzuli WHERE. W przeciwnym razie indeks nie będzie działał. Selektywność tego indeksu jest na tyle wąska, że sortowanie plików w tabeli tymczasowej (dla grupowania według) powinno być szybkie.
Powód przeniesienia c3 na koniec zapytania jest następujący. Jako przykład załóżmy, że c3 może przyjmować wartości od 0 do 100 (lub może być NULL). Jeśli uruchomisz zapytanie "IS NOT NULL", Mysql musi przeszukać prawie cały indeks B-Tree z wyjątkiem krawędzi, które odpowiadają wartości NULL. Dlatego MySQL decyduje, że pełne skanowanie tabeli jest łatwiejszą opcją niż przechodzenie przez wszystkie różne ścieżki w indeksie. Z drugiej strony zobaczysz, że jeśli twoje zapytanie było "IS NULL", a twój indeks to (c3, c4, c5, c6), to Mysql faktycznie użyje tego indeksu. Dzieje się tak, ponieważ w tym przypadku Mysql musi przeszukać tylko część drzewa indeksów odpowiadającą wartości NULL.
Rodzaj indeksów, których potrzebuje MySQL, zależy w dużej mierze od zapytania. Tworzenie indeksów we wszystkich kolumnach, jak zasugerował @louis, NIE jest dobrym pomysłem!