[mysql] Hohe Anzahl von Datensätzen

-Tob-

Lieutenant
Registriert
Feb. 2004
Beiträge
890
Guten abend,

ich hab eine paar Frage zu MySql Datenbanken und deren Performance.

Ich möchte eine Datenbank erstellen mit ungefähr 25 Tabellen, das Problem ist aber, dass ich in manchen Tabellen (2-3) eine große anzahl von Datensätzen habe. (Bis zu 1mio pro Tabelle) :)
Das ganze ist auf nem Webserver.

Meine frage ist:
Ist es ratsam so "große" Tabellen zu erstellen und damit zu arbeiten?
Wie sieht das mit der Performance aus, wird die hauptsächlich durch die Größe der einzelnen Tabellen und der Datenbank eingeschränkt oder vorallem durch die anzahl der Abfragen und benutztung?
Was sollte man vermeiden oder kann man bestimmte eingestellungen an der Datenbank vornehmen um die Performance zu verbessern?
Gibt es evtl. eine Alternative zu so großen Tabellen? Ich versuche die Datenbank möglichst Redundanz frei zu gestalten?!

Vielleicht gibt es hier ja ein paar leute mit erfahrung die mir ein paar Tipps geben könne.
z.B. eine sozusagen "maximale" empfohlen größe (anzahl) für tabellen, aus erfahrungen oder ähnliches! ;)

Bin über jeden Tipp und jede anregung dankbar!

Danke schonmal
-tob-
 
Tabellen mit 1 Mio. Datensätzen gehört eher in die Kategorie "mittel", bei hinreichend dimensionierter Hardware geht das Ding allenfalls durch schlechtes DB-Design oder falsche Konfigurationen in die Knie :D
Wichtig sind korrekt gesetzte Indizes, insbesondere dann, wenn keine multiplen Indizes für ein Query genutzt werden können (MySQL < 5.x). Desweiteren solltest du wann immer möglich auf numerische Indizes setzen, da der Lookup in literalen Indizes deutliche Performanceeinbußen zur Folge hat.

In der Standarddistribution von MySQL sind mehrere Konfigurationsdateien enthalten, die für unterschiedliche Datenmengen ausgelegt sind, ein Blick in diese Dateien sowie das Kapitel zur Maximierung der Performance im Manual sollten für die grobe Konfiguration ausreichende Informationen bieten. Der Idealfall wäre natürlich, wenn die gesamte DB in den Speicher geladen werden könnte, für den praktischen Betrieb reicht es aber aus, wenn die Indizes im Speicher Platz finden können.

greetings, Keita
 
Aha, gut zu wissen.
Vielen dank für die Antwort, dann ist das ganze also noch nicht im grenzbereich! ;)

Äh was meinst du mit Indizes? Wann muss ich die denn setzten? Hast du da evtl. ein paar beispiele und kannst mir dazu konkrete hilfe geben?

Vielen dank!
 
Der Index einer Tabelle (oder die Indizes bei umfangreicheren Tabellen) sind vergleichbar mit dem Inhalts- oder Stichwortverzeichnis eines Buchs. Der am häufigsten genutzte Index dürfte wohl der Primärschlüssel sein, diesen kann man mit den Seitenzahlen des Buches vergleichen.
Dieser Vergleich dürfte klar machen, wofür ein Index genutzt wird: willst du in einem Buch eine bestimmte Stelle finden, wäre der umständlichste Weg das Buch von vorn bis hinten durchzulesen und zu hoffen, daß du die gesuchte Stelle in vertretbarer Zeit findest, mit einer indexlosen Tabelle verhält es sich genau so. Weißt du jedoch, auf welcher Seite sich die gesuchte Passage befindet, reicht es einfach aus zu dieser Seite zu blättern und voila, bei einer Tabelle wäre das Analog der Primärschlüssel, nach dem die Datenbank suchen kann (gib mir Datensatz mit der ID 3).
Suchst du jedoch nach dem Vorkommen eines Begriffs o.ä., kommst du weder mit der Seitenzahl noch mit dem Primär schlüssel weiter, hier muß ein weiterer Index her. Bei Büchern wäre das ein Stichwortindex o.ä., bei Tabellen mußt du eine Spalte indizieren lassen:

Code:
ALTER TABLE tabellenname ADD INDEX (spaltenname);

Mit dieser Anweisung erstellst du für die Tabelle tabellenname einen Index über die Spalte spaltenname, es ist auch möglich und üblich Indizes über mehrere Spalten zu erstellen:

Code:
ALTER TABLE tabellenname ADD INDEX (spalte1, spalte2,...);

Wichtig beim Index ist die Reihenfolge, in der die Spalten eines mehrspaltigen Index angegeben werden, sie müssen nämlich mit der Reihenfolge in den Anfrargen korrespondieren. Der obige Index kann also genutzt werden, wenn erst nach spalte1 und danach nach spalte2 gesucht wird:

Code:
SELECT foo FROM bar WHERE spalte1 LIKE 'drin?' AND spalte2 LIKE 'draußen?';

Wird hingegen in umgekehrter Reihenfolge abgefragt, kann der Index nicht genutzt werden:

Code:
SELECT foo FROM bar WHERE spalte2 LIKE 'drin?' AND spalte1 LIKE 'draußen?';

Es gibt noch zahlreiche weitere Dinge, die bei der Erstellung von Indizes beachtet werden müssen, im Zeifelsfall sollte man mit EXPLAIN untersuchen, ob und welche Indizes von einem Query genutzt werden:

Code:
EXPLAIN SELECT foo FROM bar WHERE spalte1 LIKE 'drin?' AND spalte2 LIKE 'draußen?';

greetings, Keita
 
Zurück
Oben