Ini akan membantu Anda. Tulis ulang kueri Anda sebagai berikut:
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
Sekarang buat indeks komposit pada kolom (c4, c5, c6) dengan kolom DALAM ORDER ITU. Kolom dalam indeks Anda akan muncul dalam urutan yang sama dengan kolom di klausa WHERE Anda. Jika tidak, indeks tidak akan berfungsi. Selektivitas indeks ini cukup sempit sehingga pengurutan file pada tabel sementara (untuk grup menurut) harus cepat.
Alasan untuk memindahkan c3 ke akhir kueri adalah sebagai berikut. Sebagai contoh, mari kita asumsikan bahwa c3 dapat mengambil nilai antara 0 dan 100 (atau bisa NULL). Jika Anda menjalankan kueri "IS NOT NULL", maka Mysql perlu melintasi hampir semua indeks B-Tree kecuali tepi yang sesuai dengan NULL. Oleh karena itu, MySQL memutuskan bahwa pemindaian tabel penuh adalah pilihan yang lebih mudah daripada berjalan melalui semua jalur yang berbeda dalam indeks. Di sisi lain, Anda akan melihat bahwa jika kueri Anda adalah "IS NULL" dan indeks Anda adalah (c3, c4, c5, c6) maka Mysql akan menggunakan indeks ini. Hal ini karena dalam hal ini Mysql hanya perlu melintasi bagian dari pohon indeks yang sesuai dengan nilai NULL.
Jenis indeks yang dibutuhkan MySQL sangat bergantung pada kueri yang dimaksud. Membuat indeks di semua kolom, seperti yang disarankan @louis, BUKAN ide yang bagus!