Това трябва да ви помогне. Пренапишете заявката си, както следва:
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
Сега създайте съставен индекс на колони (c4, c5, c6) с колоните В ТОЗИ ПОРЪД. Колоните във вашия индекс трябва да се показват в същия ред като колоните във вашата клауза WHERE. В противен случай индексът няма да работи. Селективността на този индекс е достатъчно тясна, че сортирането на файлове във временната таблица (за групата по) трябва да бъде бързо.
Причината да преместите c3 в края на заявката е следната. Като пример, нека приемем, че c3 може да приема стойности между 0 и 100 (или може да бъде NULL). Ако изпълните заявка "IS NOT NULL", тогава Mysql трябва да премине почти през целия индекс на B-Tree с изключение на ръбовете, които отговарят на NULL. Следователно MySQL решава, че пълното сканиране на таблицата е по-лесна опция, отколкото преминаването през всички различни пътища в индекса. От друга страна, ще видите, че ако вашата заявка е "IS NULL" и вашият индекс е (c3, c4, c5, c6), тогава Mysql всъщност ще използва този индекс. Това е така, защото в този случай Mysql трябва само да премине през частта от индексното дърво, съответстваща на стойността NULL.
Видът индекси, от които се нуждае MySQL, много зависи от въпросната заявка. Създаването на индекси за всички колони, както предложи @louis, НЕ е добра идея!