sql >> Databáze >  >> RDS >> Mysql

Optimalizace dotazu na využití indexu MySQL

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“.



  1. PHP / MYSQL Přidat tlačítko do sloupce

  2. Význam MySQL INT

  3. MySQL:#1075 - Nesprávná definice tabulky; autoinkrement vs jiný klíč?

  4. Jednoduchý úvod do používání MySQL na linuxovém terminálu