Heim  >  Artikel  >  Datenbank  >  Warum weist eine Ansichtsabfrage eine Leistungsdiskrepanz im Vergleich zu einer direkten Tabellenabfrage auf?

Warum weist eine Ansichtsabfrage eine Leistungsdiskrepanz im Vergleich zu einer direkten Tabellenabfrage auf?

Susan Sarandon
Susan SarandonOriginal
2024-10-23 23:13:29281Durchsuche

Why Does a View Query Exhibit a Performance Discrepancy Compared to a Direct Table Query?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn