Diskrepanz bei der MySQL View-Abfrageleistung
Problem:
Eine Datenbanktabelle mit etwa 100.000 Benutzern Datensätze weist einen erheblichen Leistungsunterschied zwischen einer direkten Abfrage und einer Abfrage mithilfe einer Ansicht auf. Die Abfrage, die direkt auf die Tabelle zugreift, hat einen Planaufwand von 5200, während die Abfrage, die auf die Ansicht zugreift, einen Planaufwand von 100.000 hat.
Erklärung:
Die Leistungsdiskrepanz beträgt verursacht durch den Algorithmus, der zur Ausführung der Ansicht verwendet wurde. Die Ansicht verwendet in diesem Fall den „temptable“-Algorithmus, der alle Zeilen aus der zugrunde liegenden Tabelle in eine temporäre Tabelle abruft, bevor der durch die WHERE-Klausel angegebene Filtervorgang ausgeführt wird. Im Gegensatz dazu verwendet die direkte Abfrage den „Merge“-Algorithmus, der den Filtervorgang direkt an den indizierten Daten der zugrunde liegenden Tabelle ausführt.
Die WHERE-Klausel in Ansichten
Die WHERE-Klausel in einer Ansicht wird angewendet, nachdem die Ansicht alle Zeilen aus der zugrunde liegenden Tabelle abgerufen hat. Dies bedeutet, dass die WHERE-Klausel in einer Abfrage für die Ansicht dennoch auf jede aus der temporären Tabelle abgerufene Zeile angewendet wird, auch wenn die Ansicht möglicherweise mit einem bestimmten Filterkriterium erstellt wurde.
Auflösung
Um dieses Leistungsproblem zu beheben, sollte die Ansicht mit dem „Merge“-Algorithmus erstellt werden. Dies kann durch die Verwendung der Option „materialisierte Ansicht“ erreicht werden. Eine materialisierte Ansicht ist eine vorberechnete Kopie einer Ansicht. Es wird in einer physischen Tabelle gespeichert, sodass Abfragen für die materialisierte Ansicht den „Merge“-Algorithmus zum Filtern verwenden können.
Beispiel:
So erstellen Sie eine materialisierte Ansicht Verwenden Sie bei Verwendung des „Merge“-Algorithmus die folgende Syntax:
<code class="sql">CREATE MATERIALIZED VIEW vw_users AS SELECT state, COUNT(*) AS cnt FROM users GROUP BY state;</code>
Sobald die materialisierte Ansicht erstellt wurde, haben Abfragen dagegen geringere Plankosten und eine verbesserte Leistung.
Das obige ist der detaillierte Inhalt vonWarum weist eine Ansichtsabfrage eine Leistungsdiskrepanz im Vergleich zu einer direkten Tabellenabfrage auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!