2008-10-28 11 views
29

Ich fand a posting on the MySQL forums from 2005, aber nichts neueres als das. Darauf basierend ist es nicht möglich. Aber viel kann sich in 3-4 Jahren ändern.Ist es möglich, eine indizierte Sicht in MySQL zu haben?

Was ich suche ist eine Möglichkeit, einen Index über eine Ansicht zu haben, aber die Tabelle, die angezeigt wird, bleiben nicht indiziert. Die Indizierung beeinträchtigt den Schreibprozess und diese Tabelle wird ziemlich häufig geschrieben (bis zu dem Punkt, an dem die Indizierung alles zu einem Crawl verlangsamt). Dieses Fehlen eines Index macht jedoch meine Abfragen schmerzhaft langsam.

+0

Siehe http://stackoverflow.com/q/7922675/632951 – Pacerier

Antwort

28

Ich glaube nicht, dass MySQL materialisierte Ansichten unterstützt, was Sie brauchen würden, aber es würde Ihnen in dieser Situation sowieso nicht helfen. Unabhängig davon, ob sich der Index in der Ansicht oder in der zugrunde liegenden Tabelle befindet, muss er während einer Aktualisierung der zugrunde liegenden Tabelle geschrieben und aktualisiert werden, sodass die Probleme mit der Schreibgeschwindigkeit weiterhin auftreten.

Ihre beste Wette wäre wahrscheinlich, Übersichtstabellen zu erstellen, die regelmäßig aktualisiert werden.

+1

Danke. Ich habe ein wenig mehr nach materialisierten Ansichten gesucht und es sieht so aus, als ob du richtig liegst. –

7

Haben Sie in Betracht gezogen, Ihre Transaktionsverarbeitungsdaten von Ihren analytischen Verarbeitungsdaten zu abstrahieren, damit sie beide auf ihre spezifischen Anforderungen spezialisiert werden können?

Die Grundidee ist, dass Sie eine Version der Daten haben, die regelmäßig geändert wird, dies wäre die Transaktionsverarbeitungsseite und erfordert starke Normalisierung und Lichtindizes, so dass Schreibvorgänge schnell sind. Eine zweite Version der Daten ist für die analytische Verarbeitung strukturiert und neigt dazu, für schnelle Berichtsvorgänge weniger normalisiert und stärker indiziert zu sein.

Daten, die um die analytische Verarbeitung herum strukturiert sind, basieren im Allgemeinen auf der Cube-Methode des Data Warehousing. Sie bestehen aus Faktentabellen, die die Seiten des Würfels darstellen, und Dimensionstabellen, die die Kanten des Würfels darstellen.

+0

Genau daran arbeite ich gerade. Ich denke. Ich werde eine Tabelle mit den regelmäßig aktualisierten Daten haben, die für Abfragen indiziert sind. Daher muss ich die nicht indizierte Tabelle nur einmal pro [lange Zeiteinheit] abfragen, um die indizierte Tabelle mit aktualisieren zu können neue Daten. –

0

Möchten Sie nur eine indizierte Sicht? Es ist unwahrscheinlich, dass das Schreiben in eine Tabelle mit nur einem Index so störend wäre. Gibt es keinen Primärschlüssel?

Wenn jeder Datensatz groß ist, können Sie die Leistung verbessern, indem Sie herausfinden, wie Sie ihn kürzen können. Oder verkürzen Sie die Länge des benötigten Index.

Wenn dies eine schreibgeschützte Tabelle ist (dh Sie müssen keine Aktualisierungen vornehmen), kann es in MySQL tödlich sein, mit der Archivierung zu beginnen oder Datensätze (und Indexschlüssel) auf andere Weise zu löschen Füllen (Wiederverwendung) von Slots von gelöschten Schlüsseln, anstatt nur neue Indexwerte anzuhängen. Nicht intuitiv, aber in diesem Fall ist es besser, wenn Sie einen größeren Tisch haben.

2

Flexviews unterstützt materialisierte Ansichten in MySQL, indem Änderungen an zugrunde liegenden Tabellen verfolgt und die Tabelle aktualisiert wird, die als materialisierte Ansicht fungiert. Dieser Ansatz bedeutet, dass SQL, das von der View unterstützt wird, ein wenig eingeschränkt ist (da die Change Logging-Routinen herausfinden müssen, welche Tabellen sie für Änderungen verfolgen sollen), aber soweit ich weiß, ist dies am nächsten zu materialisierten Ansichten in MySQL .