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:
- Abfragen sind viel langsamer
- 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?
quelle
Antworten:
Views in MySQL werden mit einem von zwei verschiedenen Algorithmen behandelt:
MERGE
oderTEMPTABLE
.MERGE
ist einfach eine Abfrageerweiterung mit entsprechenden Aliasen.TEMPTABLE
Klingt 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
UNDEFINED
weist MySQL an, den geeigneten Algorithmus auszuwählen. MySQL wird versuchen, es zu verwenden,MERGE
weil es effizienter ist. Haupteinschränkung: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 :
Wie @ypercube hervorhebt, hat MariaDB 5.3 die gleiche Optimierung hinzugefügt. Dieser Artikel bietet einen interessanten Überblick über den Prozess:
quelle
Fields of merge-able views and derived tables are involved now in all optimizations employing equalities
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
quelle
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.
quelle