Dette burde hjælpe dig. Omskriv din forespørgsel som følger:
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
Opret nu et sammensat indeks på kolonner (c4, c5, c6) med kolonnerne I DEN RÆKKE. Kolonnerne i dit indeks skal vises i samme rækkefølge som kolonnerne i din WHERE-sætning. Ellers vil indekset ikke fungere. Selektiviteten af dette indeks er snæver nok til, at en filsortering på den midlertidige tabel (for gruppen efter) bør være hurtig.
Grunden til at flytte c3 til slutningen af forespørgslen er følgende. Lad os som et eksempel antage, at c3 kan tage værdier mellem 0 og 100 (eller det kan være NULL). Hvis du kører en "IS NOT NULL"-forespørgsel, skal Mysql gennemløbe næsten hele B-Tree-indekset undtagen de kanter, der svarer til NULL. Derfor beslutter MySQL, at en fuld tabelscanning er en nemmere mulighed end at gå gennem alle de forskellige stier i indekset. På den anden side vil du se, at hvis din forespørgsel var en "ER NULL", og dit indeks var (c3, c4, c5, c6), så vil Mysql faktisk bruge dette indeks. Dette skyldes, at Mysql i dette tilfælde kun behøver at krydse den del af indekstræet, der svarer til NULL-værdien.
Den slags indekser, MySQL har brug for, afhænger i høj grad af den pågældende forespørgsel. At oprette indekser på alle kolonnerne, som @louis foreslog, er IKKE en god idé!