[MySQL MYISAM] Performance: Tabellenspalten oder normalisieren

ChristianK

Well-known member
ID: 85965
L
25 Mai 2006
92
1
Hi,

ich bin derzeit ein neues Datenbankdesign am erstellen. Nun frage ich mich, ob ich eine Tabelle mit vielen Spalten, oder ob ich die Tabelle in viele kleine Tabellen unterteilen soll. (statt eine Spalte, kommt in der neuen Tabelle eine Zeile dazu).

Um das ganze etwas zu verdeutlichen das jetzige Design:




Beides würde ja in der Theorie gehen, nur die Frage ist wie schnell wird das eine mit vielen Spalten sein, oder das andere mit vielen Zeilen.
Bei dem Konzept mit dem vielen Spalten müssen alle abgefragt werden, andersrum werden ja nur die Zeilen verknüpft die wirklich gebraucht werden.

Um diese Zeilen zu verknüpfen bräuchte ich wieder "JOINS" die vermutlich langsamer sind(aber wie viel?).

Was wäre nun "das" bessere Datenbankdesign? Merkt man erst einen Unterschied wenn man von 100Rohstoffen spricht?



Christian
 
Also, das Thema der Optimierung ist nicht so einfach:

Tabellen mit vielen Spalten kosten IO-Performance, denn in einer Tabelle sind viel mehr Daten, diese müssen von der Platte geladen werden, da die Größe nun aber größer ist als normal, kann weniger davon im Ram gehalten werden und es werden mehr IO-Zugriffe benötigt.

Joins sind langsam. Punkt. Das heisst nun nicht, dass man sie nicht verwenden soll, ganz im Gegenteil, aber ein einzelner Query kann eben weniger Last verursachen, aber die Menge die man für nen Join braucht in einzelnen Querys ist wieder deutlich mehr Belastung.

Sollten deine Tabellen ordentlich mit Indexen verknüpft werden, die auch wirklich genutzt werden (mit einem Explain prüfen) dann denke ich gibt es kein Problem, man kann dir natürlich auch keinerlei Verbesserungsvorschläge machen, da du Sinn&Zweck dieser Tabelle und den Aufbau nicht erklärt hast und ich bestimmt nicht für dich rate, was was bedeuten soll.


Die Frage ist auch wieder wie performant muss es sein ;) Sind das Abfragen die tausendmal in der Sekunde auf verschiedenen Clusten oder Replication Slaves laufen oder einfach nur ein selten besuchtes Browsergame? Und wie groß ist die Tabelle? Sollte deine komplette Datenbank in den Ram passen (also der für MySQL zugesicherte Key-Speicher) dann wirst du kaum performance-Unterschiede feststellen, interessant wird die Datenbankoptimierung erst richtig wenn deine gesammte Datenbank größer als der verfügbare Arbeitsspeicher ist, denn dann wird der Flaschenhals die IO-Zugriffe, weil die Keys nicht im Heap behalten werden können und du musst DB-Design und Querys optimieren.


Und noch am Rande, sollte es dir um Performance gehen und du hast nicht eine Tabelle die fast nur gelesen wird (>= 60-70% nur lesende Zugriffe) nimm NIE MyIsam sondern InnoDb mit Transaktionen, denn das ist schneller, viel viel schneller ;)
Sollte die Datenbank dann an Fülle gewinnen und mehr und mehr Zugriffe in der Sekunde kommen, dann sollte man noch Feintunging an der MySQL-Config betreiben (richtig Buffer-Größen, anderes Transaktionslevel statt Read Commited falls möglich) und sich so langsam auf das switchen eines Client-Master-Modells einstellen.

So das war erstmal was ich dir anhand deiner groben Frage mit auf den Weg geben kann, es gibt nebenbei auch wirklich gute Literatur zur dem Thema, nur dann musst du wirklich sehr gut SQL können und verstehen wie eine Datenbank im Hintergrund funktioniert, also die internen Prozesse, sonst wirst du nichts wirklich richtig gut optimieren können ohne dieses fehlende Wissen.

Nachtrag:
Da es sich bei der Tabelle wohl um Daten für Gebäude halten soll, wird man diese eh kaum optimieren müssen/sollen, da du diese Daten eh in einem Cache speichern solltest, APC, Memcached oder notfalls auch ein file-Cache bieten sich da an.
 
;)

Vielen Dank für deinen guten Beitrag. Die Tabellen im Speicher zu halten finde ich nicht besonders gut. Aber den Tabellen-Typ umstellen wäre vieleicht eine ganz gute Idee. Aber wie ich gehört habe ist MyISAM für SELECT Abfragen unschlagbar :-/

Nein, die Abfragen werden wohl nicht 1000 mal in der Sekunde aufgerufen^^. Wenn das so wäre, könnte man diese Abfragen bestimmt sehr gut cachen.

Die Indexe sind schon miteingeplant und werden das ganze sehr wahrscheinlich etwas beschleunigen.
 
Die Tabellen im Speicher zu halten finde ich nicht besonders gut.
MyIsam hält sowieso sehr viel im Speicher, aber diesen ganzen Bauplan zu cachen, ist der einzig richtig performance-optimierte Weg, denn das sind ja "statische" Daten, die ändern sich ja nicht sekündlich.


Aber den Tabellen-Typ umstellen wäre vieleicht eine ganz gute Idee. Aber wie ich gehört habe ist MyISAM für SELECT Abfragen unschlagbar :-/
Jup das ist es, aber nur wenn deine Anwendung zu ~70% nur liest, sonst blockieren die Schreibprozesse (Insert + Update) die ganze Tabelle und du bist deutlich langsamer. MyIsam Tabellen haben nur in seltenen Fällen Vorteile.


Die Indexe sind schon miteingeplant und werden das ganze sehr wahrscheinlich etwas beschleunigen.
nicht glauben ;) Ausprobieren!
Einmal mit Explain und dann wirklich der Typ erstelle eine Datenbank mit möglichst realistischen Daten (unrealistische Daten lassen die Datenbank wieder ganz anders performen) und mach dir ne 300 - 400GB Datenbank und dann da mal wirklich Lasttest drauf laufen lassen, denn sobald die Daten größer sind als dein zu Verfügung stehender Arbeitsspeicher merkt man erstmal die Unterschiede zwischen performant und nicht performant, bei so mini-Dbs fällt das net auf.
 
Du meinst ja sicherlich 300 bis 400MB ;)

Einen Benchmark hatte ich auch vor zu machen. Jedoch muss dafür erst die komplette Datenbank stehen. Diese befindet sich derzeit noch in Planung :)

Kennt wer gute Programme zum Benchmarken von MySQL und vom Apache? Finde dazu fast nur Linux Software, aber ich entwickle unter Windoof..
 
Du meinst ja sicherlich 300 bis 400MB ;)
ich meinte, was ich sagte ;) 300MB passen doch locker in den Ram, das ist doch keine Kunst.


Einen Benchmark hatte ich auch vor zu machen. Jedoch muss dafür erst die komplette Datenbank stehen. Diese befindet sich derzeit noch in Planung :)
man kann doch Einzelteile benchmarken, dein ERD von oben steht doch als einzelner Part fest.


Kennt wer gute Programme zum Benchmarken von MySQL und vom Apache? Finde dazu fast nur Linux Software, aber ich entwickle unter Windoof..
MySQL Explain und für den Apache ab (das existiert auch unter Windows)
 
Cool, habe gar nicht gewusst, dass ab auch für Windows existiert ;)

300-400GB? xD
Ich würde das gerne erst mal testen. Aber so groß ist meine Festplatte noch niemals^^


Dann danke ich dir für deine Mühe. Ich werde es dann, wie aufgezeichnet, umsetzen. Oder ist noch einer anderer Meinung?

Dies reicht ja offensichtlich für ein "selten besuchtes Browsergame"!