Một vài điều ... Tôi sẽ có một chỉ mục kết hợp DUY NHẤT trên (a_id, job, state, start_time)
Điều này để giúp tối ưu hóa truy vấn trên tất cả các tiêu chí, theo tôi tin là trình tự được điều chỉnh tốt nhất. Một "A_ID", sau đó là hai công việc, một phạm vi trạng thái nhỏ, sau đó dựa trên thời gian. Tiếp theo, không có dấu ngoặc kép nào ... Có vẻ như bạn đang chuyển đổi so sánh số thành chuỗi, hãy để chúng ở dạng số để so sánh - nhanh hơn chuỗi.
Ngoài ra, bằng cách có tất cả chúng như một phần của chỉ mục, nó là chỉ mục COVERING nghĩa là nó KHÔNG phải truy cập dữ liệu trang thô để lấy các giá trị khác nhằm kiểm tra các bản ghi đủ điều kiện để đưa vào hay không.
SELECT
count(*) AS tries
FROM
tasks
WHERE
a_id = 614
AND job IN ( 1, 3 )
AND state > 80 AND state < 100
AND start_time >= 1386538013;
Bây giờ, lý do tại sao chỉ số ... hãy xem xét kịch bản sau. Bạn có hai phòng có các hộp ... Trong phòng đầu tiên, mỗi hộp là một "a_id", trong đó là các công việc theo thứ tự, trong mỗi công việc là phạm vi trạng thái và cuối cùng là thời gian bắt đầu.
Trong một phòng khác, các hộp của bạn được sắp xếp theo thời gian bắt đầu, trong đó a_id được sắp xếp và cuối cùng là trạng thái.
Điều này sẽ dễ dàng hơn để tìm thấy những gì bạn cần. Đó là cách bạn nên nghĩ về các chỉ số. Tôi muốn đi đến một ô cho "A_ID =614", sau đó chuyển sang Công việc 1 và một hộp khác cho Công việc 3. Trong mỗi Công việc 1, Công việc 3, lấy 80-100, sau đó là thời gian. Tuy nhiên, bạn biết rõ hơn dữ liệu và khối lượng của mình trong từng tiêu chí xem xét và có thể điều chỉnh.
Cuối cùng là số đếm (ID) so với số lượng (*). Tất cả những gì tôi quan tâm là một hồ sơ đủ tiêu chuẩn. Tôi không cần biết ID thực tế vì tiêu chí lọc đã đủ điều kiện là bao gồm hay không, tại sao phải tìm (trong trường hợp này) để biết "ID" thực tế.