it-swarm.com.de

MySQL zeigt die Leistung an

Wie können Sie bei der Verwendung von Ansichten eine gute Leistung sicherstellen?

Oder ist es besser, Ansichten gar nicht erst zu verwenden und nur das Äquivalent in Ihre select-Anweisungen einzubeziehen?

64
Ed Heal

Es hängt davon ab, ob.

Es kommt ganz darauf an, was Sie durch die Sicht sehen. Aber höchstwahrscheinlich reduzieren Sie Ihren Aufwand und geben eine höhere Leistung. Wenn die SQL-Anweisung auf eine nicht indizierte Ansicht verweist, analysieren der Parser und das Abfrageoptimierungsprogramm die Quelle der SQL-Anweisung und der Ansicht und lösen sie dann in einen einzelnen 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 sich die Ansicht zusammensetzt, unterliegen denselben Leistungssteigerungen oder -einbußen des Abfrageoptimierers. Ich habe noch nie die Leistung einer Ansicht im Vergleich zu der zugrunde liegenden Abfrage getestet, aber ich würde mir vorstellen, dass die Leistung geringfügig variieren kann. Sie können eine bessere Leistung für eine indizierte Ansicht erzielen, wenn die Daten relativ statisch sind. Dies könnte das sein, was Sie vielleicht als "kompiliert" betrachten.

Vorteile von Ansichten:

  1. Zeigen Sie die Daten an, ohne sie im Objekt zu speichern.
  2. Beschränken Sie die Ansicht einer Tabelle, d. H. Können einige Spalten in den Tabellen ausgeblendet werden.
  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 von VIEW vs. SQL-Anweisung
  2. Ist eine Ansicht schneller als eine einfache Abfrage?
  3. Mysql VIEWS vs. PHP query
  4. Sind MySQL-Ansichten dynamisch und effizient?
  5. Materialized View vs. Tables: 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. Siehe Leistungsverbesserungen mithilfe von indizierten Ansichten in SQL Server
92
Somnath Muluk

Ich denke, der Blog von Peter Zaitsev enthält die meisten Details. Aus persönlichen Erfahrungen zu sprechen, kann eine gute Leistung bringen, wenn Sie sie im Allgemeinen einfach halten. Bei einem meiner Kunden haben sie eine Ansicht über die andere geschichtet und es endete in einem Albtraum der Perfomance.

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

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

8
Namphibian

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

7
GDP

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

Views in MySQL sind generell eine schlechte Idee. Bei Grooveshark betrachten wir sie als schädlich und vermeiden sie immer. Wenn Sie vorsichtig sind, können Sie sie zum Laufen bringen, aber im besten Fall können Sie sich daran erinnern, wie Daten ausgewählt werden sollen, oder Sie müssen keine komplizierten Verknüpfungen erneut eingeben. Im schlimmsten Fall können sie massive Ineffizienzen verursachen, die Komplexität verbergen, versehentlich verschachtelte Unterauswahlen verursachen (die temporäre Tabellen erfordern und zu einer Überlastung der Festplatte führen) usw.

Vermeiden Sie sie am besten, und halten Sie Ihre Abfragen im Code.

7
Jay Paroline

Eine Sache, die bisher nicht erwähnt wurde, die aber einen großen Unterschied macht, ist angemessene Indizierung der Quell-Tabellen .

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

Häufig verbinden Views 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 verbinden und aggregieren.

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

! Indizieren Sie alle in JOINS- und GROUP BY-Klauseln in Ihrer CREATE VIEW-Anweisung verwendeten Spalten!

3
petermeissner

Wenn wir über "Wenn Sie Ansichten verwenden, wie Sie die Leistung sicherstellen" und nicht über den Leistungseffekt von Ansichten im Allgemeinen sprechen, geht es meiner Meinung nach um Zurückhaltung (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 machen, sollten vernünftig laufen (siehe das Kommentar-Beispiel von 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 vereinfacht.

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 mit einer gespeicherten Prozedur möglicherweise besser dran.

Um die Dinge unter Kontrolle zu halten, möchten Sie vielleicht aufschreiben, warum Sie eine bestimmte Ansicht haben und 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 die Geschwindigkeit zu erhöhen, und prüfen Sie, ob Sie diese Ansicht wirklich benötigen.

3
Nanne