Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Was ist eine gute Möglichkeit, eine MySQL-Datenbank zu denormalisieren?

Ich weiß mehr über mssql als mysql, aber ich glaube nicht, dass die Anzahl der Verknüpfungen oder die Anzahl der Zeilen, über die Sie sprechen, zu viele Probleme mit den richtigen Indizes verursachen sollte. Haben Sie den Abfrageplan analysiert, um festzustellen, ob Ihnen etwas fehlt?

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

Davon abgesehen, sobald Sie mit Ihren Indizes zufrieden sind und alle anderen Möglichkeiten ausgeschöpft haben, könnte die Denormalisierung die richtige Antwort sein. Wenn Sie nur ein oder zwei problematische Abfragen haben, ist wahrscheinlich ein manueller Ansatz angemessen, während eine Art Data-Warehousing-Tool möglicherweise besser zum Erstellen einer Plattform zum Entwickeln von Datenwürfeln geeignet ist.

Hier ist eine Seite, die ich gefunden habe und die sich mit diesem Thema befasst:

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

Hier ist eine einfache Technik, die Sie verwenden können, um die Denormalisierung von Abfragen einfach zu halten, wenn Sie nur wenige gleichzeitig ausführen (und ich ersetze nicht Ihre OLTP-Tabellen, sondern erstelle nur eine neue zu Berichtszwecken). Nehmen wir an, Sie haben diese Abfrage in Ihrer 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önnten eine denormalisierte Tabelle erstellen und mit fast derselben Abfrage füllen:

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

Beachten Sie, dass die Unterstriche mit den von Ihnen verwendeten Tabellenaliasen übereinstimmen

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

Um Ihre App dann so zu reparieren, dass sie die neue denormalisierte Tabelle verwendet, tauschen Sie die Punkte gegen Unterstriche aus.

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

Bei großen Abfragen kann dies viel Zeit sparen und macht deutlich, woher die Daten stammen, und Sie können bereits vorhandene Abfragen wiederverwenden.

Denken Sie daran, ich befürworte dies nur als letzten Ausweg. Ich wette, es gibt ein paar Indizes, die Ihnen helfen würden. Und vergessen Sie bei der Denormalisierung nicht, den zusätzlichen Speicherplatz auf Ihren Festplatten zu berücksichtigen und herauszufinden, wann Sie die Abfrage ausführen werden, um die neuen Tabellen zu füllen. Dies sollte wahrscheinlich nachts sein oder wenn die Aktivität gering ist. Und die Daten in dieser Tabelle werden natürlich nie ganz aktuell sein.

[Noch eine Bearbeitung] Vergessen Sie nicht, dass die neu erstellten Tabellen auch indiziert werden müssen! Das Gute daran ist, dass Sie nach Herzenslust indizieren können und sich keine Gedanken über Konflikte mit der Aktualisierungssperre machen müssen, da die Tabelle abgesehen von Ihrer Masseneinfügung nur Auswahlen enthält.