Wie beschleunigen Sie SQL-Abfragen? Indizes?

8

Ich habe folgende Datenbankstruktur:

%Vor%

Ich habe die folgende Abfrage in diesen Tabellen ausgeführt und ich versuche, die Abfrage so schnell wie möglich zu optimieren:

%Vor%

Wie kann ich diese Abfrage so schnell wie möglich ausführen? Sollte ich Indizes verwenden? Wenn ja, welche Spalten welcher Tabellen sollte ich indizieren?

Hier ist ein Bild meines Abfrageplans:

Danke,

    
Attilah 27.06.2013, 22:22
quelle

3 Antworten

19

Indizes sind für jede Datenbank wichtig.

In "Laien" ausgedrückt sind Indizes ... nun ja, genau das. Sie können sich einen Index als eine zweite, versteckte Tabelle vorstellen, die zwei Dinge speichert: Die sortierten Daten und einen Zeiger auf ihre Position in der Tabelle.

Einige Daumenregeln beim Erstellen von Indizes:

  1. Erstellen Sie Indizes für jedes Feld, das in Joins verwendet wird (oder wird).
  2. Erstellen Sie Indizes für jedes Feld, in dem Sie häufig where conditions durchführen möchten.
  3. Vermeiden Sie es, Indizes für alles zu erstellen. Erstellen Sie einen Index für die relevanten Felder jeder Tabelle und verwenden Sie relations, um die gewünschten Daten abzurufen.
  4. Erstellen Sie keine Indizes für double -Felder, es sei denn, dies ist absolut notwendig.
  5. Vermeiden Sie das Erstellen von Indizes für varchar -Felder, es sei denn, dies ist absolut notwendig.

Ich empfehle Ihnen, dies zu lesen: Ссылка

    
Barranka 27.06.2013, 22:59
quelle
3

Dein JOINS sollte der erste Ort sein, um zu schauen. Die beiden offensichtlichsten Kandidaten für Indizes sind AccountMapper.AccountingAccount und ChannelMapper.AccountingChannel .

Sie sollten auch die Indizierung von Shipments.MarketPlace , Shipments.ShipmentChannel und Shipments.Component in Betracht ziehen.

Durch das Hinzufügen von Indizes erhöht sich jedoch die Arbeitslast bei der Pflege der Indizes. Während sie Ihnen bei dieser Abfrage möglicherweise einen Leistungsschub verleihen, stellen Sie möglicherweise fest, dass das Aktualisieren der Tabellen inakzeptabel langsam wird. In jedem Fall könnte der MySQL-Optimierer entscheiden, dass ein vollständiger Scan der Tabelle schneller ist als der Zugriff auf den Index.

Wirklich der einzige Weg, dies zu tun, ist, die Indizes einzurichten, die Ihnen das beste Ergebnis geben, und dann das System zu benchmarken, um sicherzustellen, dass Sie die gewünschten Ergebnisse erhalten, ohne die Leistung an anderer Stelle zu beeinträchtigen. Nutzen Sie die EXPLAIN -Anweisung, um herauszufinden, was vor sich geht, und denken Sie daran dass Optimierungen, die Sie selbst oder der Optimierer auf kleinen Tischen vorgenommen haben, möglicherweise nicht dieselben Optimierungen sind, die Sie auch für größere benötigen würden.

    
user1864610 27.06.2013 22:59
quelle
2

Die anderen drei Antworten scheinen Indizes abgedeckt zu haben, so dass dies zusätzlich zu Indizes ist. Sie haben keine where-Klausel, was bedeutet, dass Sie immer die gesamte Datenbank auswählen. In der Tat hat Ihr Datenbankdesign nichts Nützliches in dieser Hinsicht, wie beispielsweise ein Versanddatum. Denke darüber nach.

Sie haben auch Folgendes:

%Vor%

Das ist alles gut und gut, aber Sie wählen nichts aus dieser Unterabfrage. Warum hast du es? Wenn Sie etwas auswählen möchten, z. B. die Summe (Betrag), müssen Sie diesem einen Alias ​​geben, um ihn in der SELECT-Klausel verfügbar zu machen.

    
Dan Bracuk 27.06.2013 23:11
quelle

Tags und Links