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?
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?
Antworten:
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.
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.
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.
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.
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!
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.