Frage

Ich habe eine große Datenbank von normierten Bestelldaten, die immer sehr langsam query für die Berichterstellung.Viele der Abfragen, die ich in berichten join fünf oder sechs Tischen und haben zu prüfen, Dutzende, Hunderte oder Tausende von Zeilen.

Es gibt viele Anfragen, und die meisten wurden optimiert, so viel wie möglich Serverlast zu reduzieren und die Geschwindigkeit erhöhen.Ich denke, es ist Zeit zu beginnen, halten Sie eine Kopie der Daten, in einer denormalisierten-format.

Alle Ideen auf einen Ansatz?Sollte ich beginnen, mit ein paar von meinen schlimmsten Abfragen und von dort aus gehen?

War es hilfreich?

Lösung

Ich weiß mehr über mssql, dass mysql, aber ich glaube nicht, dass die Anzahl der joins, oder die Anzahl der Zeilen, die Sie reden sollte dazu führen, dass Sie zu viele Probleme mit der richtigen Indizes vorhanden.Haben Sie analysiert die Abfrage planen, um zu sehen, wenn Sie fehlen?

http://dev.mysql.com/doc/refman/5.0/en/explain.html

That being said, wenn Sie satisifed mit Ihrer Indizes und erschöpft haben alle anderen Möglichkeiten, de-Normalisierung könnte die richtige Antwort.Wenn Sie müssen nur eine oder zwei Abfragen, die Probleme, eine manuelle Ansatz ist wohl geeignet, während eine Art von data warehousing-tool könnte besser sein für die Schaffung einer Plattform für die Entwicklung von Daten-cubes.

Hier ist eine Website, die ich gefunden, spricht über das Thema:

http://www.meansandends.com/mysql-data-warehouse/?link_body%2Fbody=%7Bincl%3AAggregation%7D

Hier ist eine einfache Technik, die Sie verwenden können, um halten denormalizing fragt einfach, wenn Sie nur tun, ein paar zu einem Zeitpunkt (und ich bin nicht ersetzen Sie Ihre OLTP-Tabellen, einfach einen neuen zu erstellen, die für reporting-Zwecke).Lassen Sie uns sagen, Sie haben diese Abfrage in der Anwendung:

select a.name, b.address from tbla a 
join tblb b on b.fk_a_id = a.id where a.id=1

Sie können eine denormalisierte Tabelle und füllen Sie mit fast den gleichen Abfrage:

create table tbl_ab (a_id, a_name, b_address); 
-- (types elided)

Beachten Sie die Unterstriche match des Tabellen-aliases, die Sie verwenden

insert tbl_ab select a.id, a.name, b.address from tbla a
join tblb b on b.fk_a_id = a.id 
-- no where clause because you want everything

Dann fixieren Sie Ihre app für die Verwendung der neuen denormalisierte Tabelle, wechseln Sie die Punkte für Unterstriche.

select a_name as name, b_address as address 
from tbl_ab where a_id = 1;

Für große Abfragen, dies kann sparen eine Menge Zeit und macht deutlich, Woher die Daten kamen, und Sie können re-verwenden Sie die Abfragen, die Sie bereits haben.

Denken Sie daran, ich bin nur befürworten dies als letzten Ausweg.Ich Wette, es gibt einige Indizes, die dir helfen würden.Und wenn Sie de-normalisieren, vergessen Sie nicht, Berücksichtigung der zusätzlichen Speicherplatz auf Ihren Festplatten, und Figur heraus, wenn Sie die Abfrage ausführen, um füllen die neuen Tabellen.Dies dürfte wohl in der Nacht oder Wann immer die Aktivität ist niedrig.Und die Daten in dieser Tabelle wird natürlich nie genau auf dem Laufenden zu sein.

[Noch ein weiteres Bearbeiten] vergessen Sie nicht, dass die neuen Tabellen, die Sie erstellen, die indiziert werden müssen, auch!Der gute Teil ist, dass Sie index, um Inhalt Ihres Herzens und nicht sorgen über die update-Sperre Streit, da abgesehen von bulk-einfügen der Tabelle wird nur angezeigt, wählt.

Andere Tipps

MySQL 5 wird unterstützt Ansichten, was hilfreich sein kann in diesem Szenario.Es klingt wie Sie haben bereits viel getan, der Optimierung, aber wenn nicht, können Sie die Verwendung von MySQL ist ERKLÄREN syntax, um zu sehen, welche Indizes tatsächlich verwendet werden und was ist die Verlangsamung Ihrer Anfragen.

Soweit gehen über die Normalisierung der Daten (egal, ob Sie mit Aussicht oder einfach nur duplizieren von Daten in einer effizienteren Weise), ich denke, beginnend mit dem langsamsten Abfragen und arbeiten Sie Ihren Weg durch ist ein guter Ansatz zu übernehmen.

Ich weiß das ist ein bisschen tangential, aber haben Sie versucht zu sehen, ob es weitere Indizes, die Sie hinzufügen können?

Ich habe nicht viel von DB hintergrund, aber ich bin im Umgang mit Datenbanken eine Menge vor kurzem, und ich habe gefunden, dass viele der Abfragen verbessert werden kann, einfach durch hinzufügen von Indizes.

Wir verwenden DB2, und es gibt einen Befehl namens db2expln und db2advis, die erste zeigt an, ob eine Tabelle durchsucht vs index-scans werden verwendet, und die zweite wird empfohlen Indizes, die Sie hinzufügen können, um die Leistung zu verbessern.Ich bin sicher, dass MySQL hat ähnliche tools...

Sowieso, wenn dies ist etwas, das Sie noch nicht betrachtet, aber es hat geholfen, viel mit mir...aber wenn du schon gegangen dieser Strecke, dann denke ich, es ist nicht das, was Sie suchen.

Eine andere Möglichkeit ist ein "materialized view" (oder wie Sie es nennen, die in DB2), die können geben Sie eine Tabelle, die im wesentlichen gebaut der Teile aus mehreren Tabellen.Also, eher als Normalisierung der tatsächlichen Spalten, können Sie diese Ansicht, um auf die Daten zugreifen...aber ich weiß nicht, ob dies hat schwerwiegende Auswirkungen auf die Leistung bei Einfügungen/Aktualisierungen/Löschungen (aber wenn es "materialisiert", dann sollte es helfen, mit wählt, da die Werte sind physikalisch getrennt gespeichert).

Im Einklang mit einigen der anderen Kommentare, ich würde auf jeden Fall noch einen Blick auf Ihre Indizierung.

Eine Sache, die ich entdeckte, früher in diesem Jahr auf unserem MySQL-Datenbanken wurde die macht von composite-Indizes.Zum Beispiel, wenn Sie Berichte auf, um zahlen über Datumsbereiche, einen zusammengesetzten index für die Reihenfolge, Anzahl und Reihenfolge Datum-Spalten helfen könnte.Ich glaube, MySQL kann nur ein index für die Abfrage so, wenn Sie gerade hatten getrennte Indizes auf die Bestellnummer und das Bestelldatum es würde haben zu entscheiden, auf nur eine davon zu verwenden.Mit den EXPLAIN-Befehl können helfen, dies festzustellen.

Um ein Indiz für die Leistung mit guter Indizes (darunter zahlreiche zusammengesetzte Indizes), kann ich Abfragen ausführen, Eintritt 3 Tische in unserer Datenbank und erhalten Sie fast sofortige Ergebnisse, die in den meisten Fällen.Für komplexere reporting meisten Abfragen ausführen, die in unter 10 Sekunden.Diese 3 Tabellen haben 33 Millionen Euro, 110 Millionen und 140 Millionen Zeilen jeweils.Beachten Sie, dass hatten wir auch schon normalisiert, die leicht zu Geschwindigkeit bis unsere häufigste Abfrage auf die Datenbank.

Weitere Informationen zu Ihren Tischen und die Arten von reporting-Abfragen kann zulassen, dass weitere Vorschläge.

Für MySQL ist ich mag diesen Vortrag: Real World Web:Performance & Skalierbarkeit, MySQL Edition.Dies enthält viele verschiedene Ratschläge für immer mehr Geschwindigkeit aus MySQL.

Vielleicht möchten Sie auch erwägen Sie, in eine temporäre Tabelle und dann das durchführen von Abfragen auf, die temporäre Tabelle.Dies würde die Notwendigkeit vermeiden, um wieder auf Ihre Tabellen für jede einzelne Abfrage, die Sie Problem (vorausgesetzt, Sie verwenden können die temporäre Tabelle für zahlreiche Fragen, natürlich).Diese im Grunde gibt Sie denormalisierte Daten, aber wenn Sie nur tun, wählen Sie Anrufe, gibt es keine Bedenken über die Konsistenz der Daten.

Weiter zu meiner vorherigen Antwort, ein weiterer Ansatz, den wir getroffen haben in einigen Situationen ist die store-Taste reporting-Daten in separaten zusammenfassende Tabellen.Es gibt bestimmte reporting-Abfragen, die sich nur noch langsam zu sein, auch nach denormalising und Optimierungen, und wir haben herausgefunden, dass eine Tabelle erstellen und speichern von Gesamtsummen oder Zusammenfassung von Informationen über den gesamten Monat hinweg, als Sie kam in der am Ende des Monats Berichterstattung viel schneller als gut.

Wir finden dieses Konzept einfach zu implementieren, da es nicht etwas zu brechen, das war bereits in Arbeit - es ist nur eine zusätzliche Datenbank-Einsätze an bestimmten stellen.

Ich habe liebäugelt mit zusammengesetzten Indizes und habe gesehen, einige echte Vorteile,...vielleicht werde ich das setup einige tests, um zu sehen, ob das sparen kann mich hier..zumindest für ein wenig länger.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top