Ein paar Dinge ... Ich hätte einen EINZIGEN zusammengesetzten Index für (a_id, job, state, start_time)
Dies soll dazu beitragen, die Abfrage nach allen Kriterien zu optimieren, was meiner Meinung nach die am besten abgestimmte Reihenfolge ist. Eine einzelne "A_ID", dann zwei Jobs, ein kleiner Statusbereich, dann zeitbasiert. Beachten Sie als Nächstes keine Anführungszeichen... Anscheinend haben Sie Vergleiche von Zahlen in Zeichenfolgen konvertiert, lassen Sie sie für den Vergleich numerisch -- schneller als Zeichenfolgen.
Da sie alle Teil des Indexes sind, handelt es sich außerdem um einen ABDECKENDEN Index, was bedeutet, dass er NICHT zu den Rohseitendaten gehen muss, um die anderen Werte zu erhalten, um zu testen, ob die qualifizierten Datensätze enthalten sind oder nicht.
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;
Nun, warum der Index... Betrachten Sie das folgende Szenario. Sie haben zwei Räume mit Kästchen ... Im ersten Raum ist jedes Kästchen eine "a_id", darin sind die Jobs in der Reihenfolge, in jedem Job sind die Statusbereiche und schließlich nach Startzeit.
In einem anderen Raum werden Ihre Boxen nach Startzeit sortiert, innerhalb dieser a_id werden sortiert und schließlich Status.
Was wäre einfacher zu finden, was Sie brauchen. So sollten Sie bei den Indizes denken. Ich würde lieber zu einem Feld für "A_ID =614" gehen, dann zu Job 1 und zu einem anderen für Job 3 springen. In jedem Job 1, Job 3, nimm 80-100, dann Zeit. Sie kennen jedoch besser Ihre Daten und Volumen in den einzelnen Kriterien und können diese anpassen.
Schließlich die Anzahl (ID) vs. Anzahl (*). Alles, was mir wichtig ist, ist ein qualifizierter Rekord. Ich muss die tatsächliche ID nicht kennen, da die Filterkriterien bereits als enthalten oder nicht qualifiziert sind, warum (in diesem Fall) nach der tatsächlichen "ID" suchen.