Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Abfrageoptimierung der MySQL-Indexnutzung

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.