Wann benutzt man Views in MySQL?

54

Wann wird beim Erstellen von Tabellen aus mehreren Joins zur Verwendung in der Analyse die Verwendung von Ansichten gegenüber dem Erstellen einer neuen Tabelle bevorzugt?

Ein Grund, warum ich lieber Ansichten verwenden würde, ist, dass das Datenbankschema von unserem Administrator aus Ruby heraus entwickelt wurde und ich mit Ruby nicht vertraut bin. Ich kann die Erstellung von Tabellen beantragen, benötige jedoch einen zusätzlichen Schritt und möchte mehr Flexibilität beim Entwickeln / Testen neuer Joins.

Nach der Beantwortung einer verwandten Frage zu SO ( Verwendung von R, Verwendung von SQL ) habe ich angefangen, Ansichten zu verwenden . Die Antwort mit der höchsten Bewertung beginnt mit "Führen Sie die Datenmanipulationen in SQL durch, bis sich die Daten in einer einzelnen Tabelle befinden, und führen Sie dann den Rest in R aus."

Ich habe angefangen, Ansichten zu verwenden, bin jedoch auf einige Probleme mit Ansichten gestoßen:

  1. Abfragen sind viel langsamer
  2. Ansichten werden nicht aus der Produktionsdatenbank in die Sicherungsdatenbank kopiert, die ich für die Analyse verwende.

Sind Ansichten für diese Verwendung geeignet? Wenn ja, sollte ich mit einer Leistungsminderung rechnen? Gibt es eine Möglichkeit, Abfragen zu Ansichten zu beschleunigen?

David LeBauer
quelle
Es hört sich so an, als wären Ansichten hier angebracht, aber ich bin nicht sicher, was die Verlangsamung beim Abfragen verursachen könnte.
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner Gibt es Diagnosen, die helfen könnten (abgesehen von der Erstellung eines reproduzierbaren Beispiels)? Dieselbe komplexe Abfrage dauert <4 Sekunden, wenn sie direkt in verknüpften Tabellen ausgeführt wird, und> 25 Sekunden, wenn sie in Ansichten ausgeführt wird. Wird erwartet, dass die Aufrufe keine Leistungseinbußen aufweisen?
David LeBauer
Es ist lange her, dass ich MySQL verwendet habe, also kann ich es nicht wirklich sagen.
FrustratedWithFormsDesigner
Ich benutze MySQL und werde Ihnen sagen, dass Views schrecklich und unbrauchbar sind, wenn Sie 100K und höher erreichen. Verwenden Sie einfach direkte Abfragen, bei denen Sie die Kontrolle darüber haben, welche Felder zurückgegeben werden sollen und welche
Verknüpfungen

Antworten:

43

Views in MySQL werden mit einem von zwei verschiedenen Algorithmen behandelt: MERGEoder TEMPTABLE. MERGEist einfach eine Abfrageerweiterung mit entsprechenden Aliasen. TEMPTABLEKlingt so, als würde die Ansicht die Ergebnisse in eine temporäre Tabelle einfügen, bevor die WHERE-Klausel ausgeführt wird. Sie enthält keine Indizes.

Die dritte Option UNDEFINEDweist MySQL an, den geeigneten Algorithmus auszuwählen. MySQL wird versuchen, es zu verwenden, MERGEweil es effizienter ist. Haupteinschränkung:

Wenn der MERGE-Algorithmus nicht verwendet werden kann, muss stattdessen eine temporäre Tabelle verwendet werden. MERGE kann nicht verwendet werden, wenn die Ansicht eines der folgenden Konstrukte enthält:

  • Aggregatfunktionen (SUM (), MIN (), MAX (), COUNT () usw.)

  • AUSGEZEICHNET

  • GRUPPIERE NACH

  • HABEN

  • GRENZE

  • UNION oder UNION ALL

  • Unterabfrage in der Auswahlliste

  • Bezieht sich nur auf Literalwerte (in diesem Fall gibt es keine zugrunde liegende Tabelle)

[src]

Ich wage zu vermuten, dass Ihre ANSICHTEN den TEMPTABLE-Algorithmus erfordern, was zu Leistungsproblemen führt.

Hier ist ein sehr alter Blog-Beitrag über die Leistung von Views in MySQL, der anscheinend nicht besser geworden ist.

Bei diesem Problem mit temporären Tabellen, die keine Indizes enthalten, ist am Ende des Tunnels möglicherweise etwas Licht zu sehen (was zu vollständigen Tabellensuchen führt). In 5.6 :

In Fällen, in denen Materialisierung für eine Unterabfrage in der FROM-Klausel erforderlich ist, kann der Optimierer den Zugriff auf das Ergebnis beschleunigen, indem er der materialisierten Tabelle einen Index hinzufügt. ... Nach dem Hinzufügen des Index kann der Optimierer die materialisierte abgeleitete Tabelle wie eine gewöhnliche Tabelle mit einem Index behandeln, und er profitiert in ähnlicher Weise vom generierten Index. Der Aufwand für die Indexerstellung ist im Vergleich zu den Kosten für die Ausführung von Abfragen ohne den Index vernachlässigbar.

Wie @ypercube hervorhebt, hat MariaDB 5.3 die gleiche Optimierung hinzugefügt. Dieser Artikel bietet einen interessanten Überblick über den Prozess:

Die Optimierung wird angewendet, wenn die abgeleitete Tabelle nicht mit ihrer übergeordneten SELECT-Anweisung zusammengeführt werden konnte. Dies geschieht, wenn die abgeleitete Tabelle die Kriterien für eine zusammenführbare VIEW-Anweisung nicht erfüllt

Derek Downey
quelle
Ich habe diese Behauptungen nicht getestet, aber MariaDB 5.3 (kürzlich als stabil veröffentlicht) hat einige wesentliche Verbesserungen am Optimierer, einschließlich Views :Fields of merge-able views and derived tables are involved now in all optimizations employing equalities
ypercubeᵀᴹ
@ypercube danke für diesen Link ... es scheint, dass MySQL 5.6 mindestens die Optimierung hat, einen Index zu abgeleiteten Tabellen hinzuzufügen.
Derek Downey
14

Views sind Sicherheitstools. Damit ein bestimmter Benutzer oder eine bestimmte Anwendung nicht weiß, wo sich Ihre Datentabelle befindet, stellen Sie einer Ansicht nur die Spalten zur Verfügung, die sie benötigt.

Denken Sie daran, dass Ansichten immer die Leistung beeinträchtigen. Ähnliche Abfragen sollten gespeicherte Prozeduren und Funktionen sein, keine Ansichten.

Um eine Abfrageoptimierung durchzuführen, befolgen Sie stets die bewährten Methoden, vermeiden Sie die Verwendung von Funktionen in WHERE-Klauseln, erstellen Sie Indizes, um die Auswahl zu beschleunigen, aber missbrauchen Sie keine Indizes, um Einfügungen, Aktualisierungen und Löschvorgänge zu beeinträchtigen.

Es gibt eine gute Dokumentation, die Ihnen dabei helfen kann: http://www.toadworld.com/LinkClick.aspx?fileticket=3qbwCnzY/0A=&tabid=234

Rainier Morilla
quelle
5
Ich bin nicht einverstanden, dass Ansichten (nur) Sicherheitstools sind. Sie können auf diese Weise verwendet werden, aber wir entfernen damit die Komplexität von Abfragen, die unsere Berichtsentwickler regelmäßig verwenden.
JHFB
2
@JHFB: Ich stimme Ihnen zu, aber vielleicht funktioniert das nur in MySQL, wo es so klingt, als würde die Ansicht schwerwiegende Leistungseinbußen nach sich ziehen?
FrustratedWithFormsDesigner
@frustratedwithformsdesigner großer Punkt - es ist schon eine Weile her, seit ich MySQL verwendet habe.
JHFB
1
@ JHFB Ansichten auf MySQL sind ein großes Problem! mysqlperformanceblog.com/2007/08/12/…
Rainier Morilla
2
@ RainierMorilla Views verschlechtern die Leistung !! ??
Suhail Gupta
-2

Ich denke, Views sind die vordefinierte Struktur (keine Daten) für das Zusammenführen von Tabellen zu einer, die aus mehreren Tabellenabfragen zu überwinden ist. Diese können aus realen Daten für schnelle relationale Abfragen verwendet werden.

Shahzad Shaikh
quelle
2
Es ist nicht sehr klar, welchen Punkt Sie anstreben und wie damit die im ursprünglichen Beitrag dargelegten Probleme angegangen werden. Vielleicht möchten Sie die Frage noch einmal lesen, aber in jedem Fall sollten Sie erwägen, Ihre Antwort zu erweitern, um zu verdeutlichen, wie sie auf das Problem des OP angewendet werden kann.
Andriy M