Ich verwende derzeit die folgende Abfrage, die etwa 8 Minuten dauert, um das Ergebnis aufgrund des Datenvolumens zurückzugeben (ca. 14 Monate). Kann ich das bitte beschleunigen?
Die fragliche Datenbank ist MySQL mit InnoDb-Engine
%Vor% Daten werden nach 6 Monaten partitioniert. Jede Spalte, die in die WHERE-Klausel eingeht, wird indiziert. Es gibt eine ganze Reihe von Indizes & amp; wäre eine große Liste hier aufzulisten. Daher nur in Worten zusammenfassen. In Bezug auf diese Abfrage ist EVE_DATE + PAGE_TYPE_COUNT
einer der zusammengesetzten Indizes & amp; so sind CUST + SITE_SERV + EVE_DATE
, EVE_DATE + SITE_SERV
, EVE_DATE + SITE
,
Der Primärschlüssel ist eigentlich eine Dummy-Autoinkrementnummer. Es wird nicht verwendet, um ehrlich zu sein. Ich habe keinen Zugriff auf den EXPLAIN-Plan. Ich werde sehen, was ich dafür tun kann.
Ich würde mich über jede Hilfe freuen, um diese zu verbessern.
Gut, da die Tabellenbereichspartition auf EVE_DATE ist, sollte das DBMS leicht sehen, welche Partition zu lesen ist. Es geht also darum, welchen Index man verwenden soll.
Es gibt eine Spalte, die Sie auf Gleichheit prüfen ( SITE = 'P'
). Dies sollte in Ihrem Index an erster Stelle stehen. Sie können dann EVE_DATE
und SITE_SERV
in beliebiger Reihenfolge hinzufügen. Daher sollte Ihr Index in der Lage sein, die fraglichen Tabellendatensätze so schnell wie möglich zu finden.
Wenn Sie jedoch die anderen in Ihrer Abfrage verwendeten Felder zu Ihrem Index hinzufügen, müsste die Tabelle nicht einmal gelesen werden, da alle Daten im Index selbst verfügbar wären:
%Vor%Dies sollte der optimale Index für Ihre Abfrage sein, wenn ich mich nicht irre.
Der wichtigste Optimierungsfaktor wären Indizes. Ihre Suchanfrage sollte möglichst genau übereinstimmen, zum Beispiel:
%Vor% Die Reihenfolge ist wichtig, zumindest für SITE_SERV als letzter Wert; Wenn Sie LIKE
verwenden, verwenden Sie nicht den vollen Wert, was die Effizienz des Index für die nächsten Spalten verschlechtert.
Sie können auch ein kleines bisschen gewinnen, indem Sie IF
entfernen und Typ und Anzahl zurückgeben; vielleicht können Sie diesen Wert in Ihrer Front-Anwendung bearbeiten / formatieren?
Wie auch immer, Sie sollten mit der Profilerstellung Ihrer aktuellen Abfrage beginnen, indem Sie EXPLAIN
verwenden, um zu sehen, was schief läuft. Wenn das nicht möglich ist, könnten Sie versuchen, Struktur, Indizes und ein paar Dummy-Daten in einer lokalen DB zu reproduzieren, Volume ist dort nicht relevant.
Fügen Sie diese zwei Indizes hinzu:
%Vor%Der Optimierer wird die Statistiken betrachten und zwischen ihnen auswählen. Grob gesagt wäre die erste besser, wenn es weniger Reihen mit 'P' & amp; DATEN in diesem Bereich als "P" & amp; 'serv1X%'.
Ja, der "Covering" -Index, dass Thorsten vielleicht besser ist, aber er hat mehr Felder, als ich gerne in einen Index lege.
PARTITIONing
könnte helfen. Aber es gibt zu wenig Informationen, um es sicher zu sagen. Der Grund für die Partitionierung könnte sein, dass Sie eine "2-dimensionale" Suche haben - einen Datumsbereich und 'serv1X%'. Sie müssten entweder nach Datum oder site_serv partitionieren und dann PRIMARY KEY(site, ..., ...)
mit dem anderen von (date oder site_serv) als zweite Spalte angeben. Der Rest der Spalten müsste sowohl den Partitionsschlüssel als auch einige Spalten enthalten, um sie eindeutig zu machen. Das wird so unordentlich, dass ich nicht darüber nachdenken möchte.
Tags und Links sql mysql query-optimization