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,
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:
where
conditions durchführen möchten. double
-Felder, es sei denn, dies ist absolut notwendig. varchar
-Felder, es sei denn, dies ist absolut notwendig. Ich empfehle Ihnen, dies zu lesen: Ссылка
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.
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.
Tags und Links sql optimization mysql database