これはあなたを助けるはずです。クエリを次のように書き直します。
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句の列と同じ順序で表示される必要があります。そうしないと、インデックスが機能しません。このインデックスの選択性は十分に狭いため、一時テーブル(group byの場合)のファイルソートは高速である必要があります。
c3をクエリの最後に移動する理由は次のとおりです。例として、c3が0〜100の値を取ることができる(またはNULLになる可能性がある)と仮定します。 「ISNOTNULL」クエリを実行する場合、Mysqlは、NULLに対応するエッジを除くほとんどすべてのBツリーインデックスをトラバースする必要があります。したがって、MySQLは、インデックス内のすべての異なるパスをウォークスルーするよりも、全表スキャンの方が簡単なオプションであると判断します。一方、クエリが「IS NULL」であり、インデックスが(c3、c4、c5、c6)の場合、Mysqlは実際にこのインデックスを使用することがわかります。これは、この場合、MysqlがNULL値に対応するインデックスツリーの部分をトラバースするだけでよいためです。
MySQLに必要なインデックスの種類は、問題のクエリに大きく依存します。 @louisが提案したように、すべての列にインデックスを作成することはお勧めできません!