it-swarm.com.de

Wann werden Ansichten in MySQL verwendet?

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

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

Ich habe angefangen, Ansichten zu verwenden, nachdem die Antwort auf eine verwandte Frage auf SO ( Wann wird R verwendet, wann wird SQL verwendet) ). Die Antwort mit der höchsten Abstimmung beginnt mit "do the Datenmanipulationen in SQL, bis sich die Daten in einer einzelnen Tabelle befinden, und den Rest in R. "

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

  1. abfragen sind viel langsamer
  2. Ansichten werden nicht von der Produktion in die Sicherungsdatenbank kopiert, die ich für die Analyse verwende.

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

59
David LeBauer

Ansichten in MySQL werden mit einem von zwei verschiedenen Algorithmen behandelt: MERGE oder TEMPTABLE. MERGE ist einfach eine Abfrageerweiterung mit entsprechenden Aliasnamen. TEMPTABLE ist genau das, wonach es sich anhört. Die Ansicht fügt die Ergebnisse in eine temporäre Tabelle ein, bevor die WHERE-Klausel ausgeführt wird, und es gibt keine Indizes dafür.

Die 'dritte' Option ist UNDEFINED, die MySQL anweist, den geeigneten Algorithmus auszuwählen. MySQL wird versuchen, MERGE zu verwenden, da dies effizienter ist. Hauptvorbehalt:

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.)

  • UNTERSCHEIDLICH

  • 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 VIEWS den TEMPTABLE-Algorithmus benötigen, was zu Leistungsproblemen führt.

Hier ist ein wirklich alter Blog-Beitrag über die Leistung von Ansichten in MySQL und es scheint nicht besser geworden zu sein.

Am Ende des Tunnels ist jedoch möglicherweise etwas Licht auf dieses Problem mit temporären Tabellen zu sehen, die keine Indizes enthalten (was zu vollständigen Tabellenscans führt). In 5.6 :

In Fällen, in denen für eine Unterabfrage in der FROM-Klausel eine Materialisierung 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 normale Tabelle mit einem Index behandeln und 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 Index vernachlässigbar.

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

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

45
Derek Downey

Ansichten sind Sicherheitstools. Sie möchten nicht, dass ein bestimmter Benutzer oder eine bestimmte Anwendung weiß, wo sich Ihre Datentabelle befindet. Sie bieten eine Ansicht nur mit den Spalten, 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 vorzunehmen, befolgen Sie immer die Best Practices, vermeiden Sie die Verwendung von Funktionen in WHERE-Klauseln, erstellen Sie Indizes, um die Auswahl zu beschleunigen, aber missbrauchen Sie sie nicht. Indizes beeinträchtigen Einfügungen, Aktualisierungen und Löschungen.

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

15
Rainier Morilla