Điều này sẽ giúp bạn. Viết lại truy vấn của bạn như sau:
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
Bây giờ, hãy tạo một chỉ mục tổng hợp trên các cột (c4, c5, c6) với các cột TRONG THỨ TỰ ĐÓ. Các cột trong chỉ mục của bạn sẽ xuất hiện theo thứ tự giống như các cột trong mệnh đề WHERE của bạn. Nếu không chỉ mục sẽ không hoạt động. Tính chọn lọc của chỉ mục này đủ hẹp để sắp xếp tệp trên bảng tạm thời (cho nhóm theo) phải nhanh.
Lý do để di chuyển c3 vào cuối truy vấn là như sau. Ví dụ, chúng ta hãy giả sử rằng c3 có thể nhận các giá trị từ 0 đến 100 (hoặc nó có thể là NULL). Nếu bạn chạy truy vấn "IS NOT NULL", thì Mysql cần duyệt gần như tất cả chỉ mục B-Tree ngoại trừ các cạnh tương ứng với NULL. Do đó, MySQL quyết định rằng quét toàn bộ bảng là một lựa chọn dễ dàng hơn so với việc đi qua tất cả các đường dẫn khác nhau trong chỉ mục. Mặt khác, bạn sẽ thấy rằng nếu truy vấn của bạn là "IS NULL" và chỉ mục của bạn là (c3, c4, c5, c6) thì Mysql sẽ sử dụng chỉ mục này. Điều này là do trong trường hợp này Mysql chỉ cần duyệt qua phần của cây chỉ mục tương ứng với giá trị NULL.
Loại chỉ mục mà MySQL cần phụ thuộc rất nhiều vào truy vấn được đề cập. Tạo chỉ mục trên tất cả các cột, như @louis đề xuất, KHÔNG phải là một ý kiến hay!