Een paar dingen... Ik zou een ENKELE samengestelde index hebben op (a_id, job, state, start_time )
Dit om de zoekopdracht op alle criteria te optimaliseren, in wat volgens mij de best afgestemde volgorde is. Een enkele "A_ID", vervolgens twee taken, een klein statusbereik en vervolgens op tijd gebaseerd. Let vervolgens op geen aanhalingstekens... Het lijkt erop dat u numerieke naar tekenreeksvergelijkingen converteerde, laat ze als numeriek achter om te vergelijken -- sneller dan tekenreeksen.
Door ze allemaal als onderdeel van de index te hebben, is het een DEKKENDE index, wat betekent dat het NIET naar de onbewerkte paginagegevens hoeft te gaan om de andere waarden te krijgen om te testen of de kwalificerende records al dan niet worden opgenomen.
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;
Nu, de waarom de index... overweeg het volgende scenario. Je hebt twee kamers die dozen hebben... In de eerste kamer is elke doos een "a_id", daarbinnen zijn de banen in volgorde, binnen elke baan zijn de statusbereiken en ten slotte de starttijd.
In een andere kamer worden je dozen gesorteerd op starttijd, binnen die a_id worden ze gesorteerd en tenslotte staat.
Dat zou gemakkelijker zijn om te vinden wat je nodig hebt. Zo moet je over de indexen denken. Ik ga liever naar het ene vak voor "A_ID =614", dan naar Job 1 en een ander voor Job 3. Binnen elke Job 1, Job 3, pak 80-100 en dan de tijd. U kent uw gegevens en volume echter beter bij elke overweging van de criteria en kunt deze aanpassen.
Ten slotte de count(ID) vs count(*). Het enige waar ik om geef is een gekwalificeerd record. Ik hoef de werkelijke ID niet te weten, aangezien de filtercriteria al zijn gekwalificeerd als al dan niet inbegrepen, waarom zou ik (in dit geval) naar de werkelijke "ID" zoeken.