MySQL zeigt Leistung [geschlossen]


74

Wie können Sie eine gute Leistung sicherstellen, wenn Sie Ansichten verwenden?

Oder ist es besser, überhaupt keine Ansichten zu verwenden und nur das Äquivalent in Ihre ausgewählten Anweisungen aufzunehmen?


7
Ich fand diesen Blog-Artikel von Peter Zaitsev in der Vergangenheit ziemlich informativ.
Eggyal

@eggyal - Danke, werde lesen und nachdenken
Ed Heal

Überprüfen Sie auch die aktuellen Versionen von MariaDB 5.3 (und 5.5), die verschiedene Verbesserungen am Optimierer aufweisen, einschließlich Ansichten.
Ypercubeᵀᴹ

Der obige Link ist defekt, hier ist der aktualisierte Link .
wmute

Antworten:


106

Es hängt davon ab, ob.

Es hängt ganz davon ab, was Sie durch die Ansicht sehen. Aber höchstwahrscheinlich reduzieren Sie Ihren Aufwand und erzielen eine höhere Leistung. Wenn die SQL-Anweisung auf eine nicht indizierte Ansicht verweist, analysieren der Parser und das Abfrageoptimierungsprogramm die Quelle sowohl der SQL-Anweisung als auch der Ansicht und lösen sie dann in einen einzigen Ausführungsplan auf. Es gibt keinen Plan für die SQL-Anweisung und keinen separaten Plan für die Ansicht.

Eine Ansicht wird nicht kompiliert . Es ist eine virtuelle Tabelle, die aus anderen Tabellen besteht. Wenn Sie es erstellen, befindet es sich nicht irgendwo auf Ihrem Server. Die zugrunde liegenden Abfragen, aus denen die Ansicht besteht, unterliegen denselben Leistungssteigerungen oder -einbußen wie das Abfrageoptimierungsprogramm. Ich habe die Leistung einer Ansicht im Vergleich zur zugrunde liegenden Abfrage noch nie getestet, aber ich würde mir vorstellen, dass die Leistung geringfügig variieren kann. Sie können eine bessere Leistung in einer indizierten Ansicht erzielen, wenn die Daten relativ statisch sind. Dies könnte das sein, was Sie vielleicht in Bezug auf "kompiliert" denken.

Vorteile der Ansichten:

  1. Zeigen Sie die Daten an, ohne sie im Objekt zu speichern.
  2. Beschränken Sie die Ansicht einer Tabelle, dh können Sie einige Spalten in den Tabellen ausblenden.
  3. Verbinden Sie zwei oder mehr Tabellen und zeigen Sie sie dem Benutzer als ein Objekt an.
  4. Beschränken Sie den Zugriff auf eine Tabelle, damit niemand die Zeilen in die Tabelle einfügen kann.

Siehe diese nützlichen Links:

  1. Leistung der Anweisung VIEW vs. SQL
  2. Ist eine Ansicht schneller als eine einfache Abfrage?
  3. MySQL VIEWS vs. PHP-Abfrage
  4. Sind MySQL-Ansichten dynamisch und effizient?
  5. Materialisierte Ansicht vs. Tabellen: Was sind die Vorteile?
  6. Ist das Abfragen einer Ansicht langsamer als das direkte Ausführen von SQL?
  7. Eine Problemumgehung für die Leistungsprobleme von TEMPTABLE-Ansichten
  8. Zeigen Sie Leistungssteigerungen an, indem Sie indizierte Ansichten in SQL Server verwenden

2
Sie erwähnen indizierte Ansichten und haben mehrere Links für Artikel zu indizierten und materialisierten Ansichten. Das ist alles in Ordnung und gut. Aber hat MySQL indizierte Ansichten?
Ypercubeᵀᴹ

6
Nein, derzeit unterstützt MySQL keine indizierten Ansichten.
Somnath Muluk

2
Gute Antwort. Ich werde nur hinzufügen, dass eine Ansicht im Grunde eine benannte Abfrage in MySQL ist. Wenn Sie sicherstellen, dass die Abfrage, die die Ansicht generiert, eine gute Leistung aufweist, wenn sie alleine ausgeführt wird, sollte die Ansicht eine ähnliche Leistung erbringen.
Kasey Speakman

1
Ein zusätzlicher ~~ Vorteil der Ansicht kann der Einschränkung des Zugriffs entgegengesetzt sein. Wenn Sie die Ansicht richtig einstellen, können Sie Daten tatsächlich "hinzufügen / aktualisieren / löschen", um sie so anzuzeigen, als wäre es eine echte Tabelle (was zu partiellen Abfragen führt, die die realen Tabellen verändern )
jave.web

1
"Ich habe die Leistung einer Ansicht im Vergleich zur zugrunde liegenden Abfrage noch nie getestet, aber ich würde mir vorstellen, dass die Leistung geringfügig variieren kann." - Leider ist für MySQL "leicht variieren" eine grobe Untertreibung. Eine Ansicht ist möglicherweise um Größenordnungen langsamer als die direkte Ausführung der SELECT-Anweisung.
Frank Schmitt

9

Ich denke, der Blog von Peter Zaitsev enthält die meisten Details. Das Sprechen aus persönlichen Erfahrungsansichten kann gut funktionieren, wenn Sie sie im Allgemeinen einfach halten. Bei einem meiner Kunden haben sie immer wieder eine Ansicht über die andere geschichtet, und es endete in einem Alptraum der Leistung.

Im Allgemeinen verwende ich Ansichten, um einen anderen Aspekt einer Tabelle anzuzeigen. Zeigen Sie mir beispielsweise in meiner Mitarbeitertabelle die Manager oder verbergen Sie das Gehaltsfeld vor Nicht-HR-Mitarbeitern. Stellen Sie außerdem immer sicher, dass Sie eine EXPLAIN für die Abfrage und Ansicht ausführen, um genau zu verstehen, was in MySQL geschieht.

Wenn Sie in Ihrem Szenario einen soliden Beweis wünschen, würde ich vorschlagen, dass Sie testen. Es ist wirklich schwer zu sagen, dass die Verwendung von Ansichten immer ein Leistungskiller ist, aber eine schlecht geschriebene Ansicht wird wahrscheinlich Ihre Leistung beeinträchtigen.


8

Hier ist eine Zusammenfassung, Sie können detaillierte Bewertungen von Peter Zaitsev und anderswo finden.

Ansichten in MySQL sind im Allgemeinen eine schlechte Idee. Bei Grooveshark betrachten wir sie als schädlich und meiden sie immer. Wenn Sie vorsichtig sind, können Sie sie zum Laufen bringen, aber im besten Fall können Sie sich daran erinnern, wie Sie Daten auswählen oder komplizierte Verknüpfungen nicht erneut eingeben müssen. Im schlimmsten Fall können sie massive Ineffizienzen verursachen, die Komplexität verbergen, versehentlich verschachtelte Unterauswahlen verursachen (temporäre Tabellen erforderlich machen und zu Festplatten-Thrashing führen) usw.

Vermeiden Sie sie am besten und behalten Sie Ihre Abfragen im Code.


1
Ich wünschte, ich hätte diesen Kommentar vor meinem Team gesehen und ich hätte all diese Ansichten mit vielen
Ralph

8

Sie erfüllen ihren Zweck, aber die verborgenen Komplexitäten und Ineffizienzen überwiegen normalerweise einen direkteren Ansatz. Ich bin einmal auf eine SQL-Anweisung gestoßen, die zwei Ansichten zusammenfasste und die Ergebnisse sortierte. Die Ansichten wurden ebenfalls sortiert, sodass die Ausführungszeit in Stunden gemessen werden konnte.


4

Eine Sache nicht erwähnt , so weit , aber einen großen Unterschied machen , ist eine angemessene Indexierung der Ansichten Quellentabellen .

Wie oben erwähnt, befinden sich Ansichten nicht in Ihrer Datenbank, sondern werden jedes Mal neu erstellt . Somit erhöht alles, was die Wiederherstellung für die Datenbank erleichtert, die Leistung der Ansicht.

Häufig verknüpfen Ansichten Daten auf eine Weise, die für die Speicherung sehr schlecht ist (keine normale Form), aber für die weitere Verwendung sehr gut ist (Analyse durchführen, Daten dem Benutzer präsentieren, ...) und damit Daten aus verschiedenen Tabellen zusammenfügen und aggregieren.

Ob die Spalten, für die die Vorgänge ausgeführt werden, indiziert sind oder nicht, hat einen großen Einfluss auf die Leistung einer Ansicht. Wenn die Tabellen und ihre relevanten Spalten bereits beim Zugriff auf die Ansicht indiziert sind, werden die Indizes nicht immer wieder neu berechnet . (Auf der anderen Seite geschieht dies, wenn Daten in den Quelltabellen bearbeitet werden.)

! Indizieren Sie alle Spalten, die in den Klauseln JOINS und GROUP BY in Ihrer Anweisung CREATE VIEW verwendet werden!


3

Wenn wir über "Wenn Sie Ansichten verwenden, wie Sie die Leistung sicherstellen" und nicht über den Leistungseffekt von Ansichten im Allgemeinen sprechen, denke ich, dass dies auf Zurückhaltung hinausläuft (wie bei Ihnen selbst).

Sie können in große Schwierigkeiten geraten, wenn Sie nur Ansichten schreiben, um die Abfrage in allen Fällen zu vereinfachen. Achten Sie jedoch nicht darauf, dass Ihre Ansichten in Bezug auf die Leistung tatsächlich nützlich sind. Alle Abfragen, die Sie am Ende ausführen, sollten ordnungsgemäß ausgeführt werden (siehe das Kommentarbeispiel zu diesem Link von @eggyal). Natürlich ist das eine Tautologie, aber nicht weniger wertvoll

Sie müssen besonders vorsichtig sein, um keine Ansichten aus Ansichten zu erstellen, nur weil dies die Erstellung dieser Ansicht möglicherweise erleichtert.

Am Ende müssen Sie sich den Grund ansehen, warum Sie Ansichten verwenden. Jedes Mal, wenn Sie dies tun, um das Programmieren zu vereinfachen, sind Sie meiner Meinung nach mit einer gespeicherten Prozedur IMHO besser dran.

Um die Kontrolle zu behalten, möchten Sie möglicherweise aufschreiben, warum Sie eine bestimmte Ansicht haben, und entscheiden, warum Sie sie verwenden. Überprüfen Sie für jede 'neue' Verwendung in Ihrer Programmierung erneut, ob Sie die Ansicht tatsächlich benötigen, warum Sie sie benötigen und ob dies Ihnen immer noch einen vernünftigen Ausführungspfad geben würde. Überprüfen Sie weiterhin Ihre Verwendungszwecke, um sie schnell zu halten, und überprüfen Sie weiterhin, ob Sie diese Ansicht wirklich benötigen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.