Pár věcí... Chtěl bych mít JEDEN složený index on (a_id, job, state, start_time)
To pomůže optimalizovat dotaz na všechna kritéria, v tom, co považuji za nejlépe vyladěnou sekvenci. Jediné "A_ID", pak dvě úlohy, malý rozsah stavů, pak podle času. Dále si nevšímejte uvozovek... Zdá se, že jste převáděli číselná na porovnání řetězců, ponechte je pro porovnání jako číselná – rychleji než řetězce.
Také tím, že jsou všechny součástí indexu, jde o KRYCÍ index, což znamená, že NENÍ nutné přejít na nezpracovaná data stránky, aby získal další hodnoty k testování kvalifikačních záznamů, které mají být zahrnuty nebo ne.
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;
Nyní, proč index... zvažte následující scénář. Máte dvě místnosti, které mají krabice... V první místnosti je každá krabice "a_id", v níž jsou úlohy v pořadí, v každé úloze jsou rozsahy stavů a nakonec podle času zahájení.
V jiné místnosti jsou vaše krabice seřazeny podle času zahájení, v rámci tohoto a_id a nakonec stavu.
Což by bylo jednodušší najít to, co potřebujete. Tak byste měli přemýšlet o indexech. Raději bych šel do jednoho pole pro "A_ID =614", pak skočil na Job 1 a další pro Job 3. V rámci každé Job 1, Job 3, urvat 80-100, pak čas. Vy však lépe znáte svá data a objem v každém zvažování kritérií a můžete se upravit.
Nakonec počet (ID) vs počet (*). Jde mi jen o rekordní kvalifikaci. Nepotřebuji znát skutečné ID, protože kritéria filtrování již byla kvalifikována jako zahrnutí nebo ne, proč hledat (v tomto případě) skutečné „ID“.