Haben zu viele Tabellen in einer MySQL-Datenbank die Leistung beeinträchtigen?

9

Wenn zu viele Tabellen (z. B. 200) in einer einzelnen MySQL-Datenbankinstanz vorhanden sind, kann dies die Leistung beeinträchtigen.

user25704
quelle

Antworten:

7

Je mehr Sie haben, desto geringer ist im Allgemeinen die Leistung. 200 scheint jedoch eine ziemlich kleine Zahl zu sein. 2.000 könnten ein echter Performance-Hit sein und definitiv 20.000. Im Allgemeinen sollten Sie jedoch die Anzahl der Tabellen klein halten, da MySQL eine sehr große Anzahl von Zeilen in der Tabelle verarbeiten kann.

Topher Fangio
quelle
6
Eine große Anzahl von Tabellen kann einen großen Unterschied machen, wenn Ihre Anwendung 'information_schema' verwendet. Nichts in 'information_schema' wird zwischengespeichert. Dies wird von mehreren verschiedenen ORM-Systemen stark genutzt.
Zoredache
4

Die Anzahl der Tabellen ist weniger wichtig als:

  1. Welche Abfragen Sie ausführen - Es ist unwahrscheinlich, dass Sie alle 200 in einer einzigen Abfrage abfragen
  2. Die Gesamtlast der Abfrage auf dem System zu einem bestimmten Zeitpunkt

Übermäßige Tabellen bedeuten Speicher und Festplattenspeicher, der wiedergewonnen und für andere Zwecke verwendet werden kann. Beachten Sie, dass die Denormalisierung Ihrer Tabellen das Risiko fehlerhafter Daten erhöht, da Sie die referenzielle Integrität verlieren.

OMG Ponys
quelle
4

Im Allgemeinen sollten 200 Tabellen kein Problem sein, aber es hängt von einer Reihe von Dingen ab.

Dedizierter MySQL-Server gegen Server, der mit anderer Software geteilt wird, 128 MB gegen 128 GB RAM usw., kleine Tabellen mit wenigen Datensätzen gegen Tabellen mit Blobs und Millionen von Zeilen.

MySQL verfügt möglicherweise über Einstellungen und mehrere Engines, die sich jeweils auf unterschiedliche Weise auf die Tabellenleistung auswirken.

MyISAM hat normalerweise drei Dateien pro Tabelle .frm, .MYD, .MYI

INNODB hat im normalen Modus .frm mit allen in der zentralen Datei gespeicherten Daten

INNODB in einer Datei pro Tabellenmodus hat .frm, .idb

table_open_cache ist die Anzahl der Tabellen, die gleichzeitig geöffnet werden können (Standard 64). Dies muss möglicherweise größer sein als die Anzahl der Tabellen in Ihrem Schema, da dies damit zusammenhängt, wie viele Verbindungen die Datenbank abfragen. 100 Verbindungen, die 3 Tabellen verbinden, können bedeuten, dass 300 Tabellen zwischengespeichert sind und temporäre Tabellen vorhanden sind. Im Allgemeinen ist ein Schema oder Verbindungen umso komplexer, je größer die Anzahl ist.

open-files-limit Ich neige dazu, dies auf 4x table_open_cache zu setzen, was großzügig sein sollte, anstatt sich die Mühe zu machen, einen genauen Wert zu ermitteln.

Das Limit für die Dateihandhabung des Betriebssystems für den MySQL-Benutzer kann ebenfalls ein Problem sein (unter Linux kann der Standardwert häufig 1024 sein, ulimit -n, um Benutzerlimits anzuzeigen). Dies kann zu einem Problem mit einer großen Anzahl von Tabellen führen, wenn die Anzahl geringer ist MySQL erfordert. Dies sollte mindestens dem Open-Files-Limit entsprechen.

Wie bei jeder Datenbank gibt es Hunderte von Optimierungsparametern, die Sie anpassen können, um die Datenbank für Ihr bestimmtes Schema zu optimieren. MySQL ist dafür schlechter als die meisten anderen, da Sie zusätzliche Engines anschließen können, wenn Sie möchten, z. B. NDB-Cluster-Engine.

http://dev.mysql.com/doc/refman/5.1/en/table-cache.html

Ich hoffe es hilft


quelle
2

Für den Index jeder Tabelle hat MySQL einen eigenen Index. Index benötigt Speicher zum Halten und Verwenden, und es gibt ein globales Limit für Indizes. Wenn es viele Tabellen gibt, können sich nicht alle Indizes im RAM befinden, sodass sie auf die Festplatte übertragen werden, was sich direkt auf die Leistung auswirkt. Versuchen Sie erhöhen diese in my.cnf: key_buffer_size=256M: Das ist die Menge an RAM zur Seite legen für Indexinformationen zu halten.

kolypto
quelle
1

Kann es? Sicher. Aber wie viel hängt stark von Ihrer App und ihren Zugriffsmustern ab und davon, ob Sie myisam oder innodb verwenden und ob sich innodb im Datei-pro-Tabelle-Modus befindet oder nicht, und von der Größe der innodb-Protokolle. Sie müssen uns mehr Details geben.

Jim Zajkowski
quelle
1

Nein - Ich glaube nicht, dass die Anzahl der Tabellen der Leistungsengpass in Ihrem System darstellt. Schließlich handelt es sich nur um Dateien in Ihrem Dateisystem. Es ist nichts Ungewöhnliches, Hunderte von Tabellen in einer Datenbank zu haben.

Viel wahrscheinlicher ist, dass Ihre Abfragen nicht richtig optimiert sind. Ich würde empfehlen, das log-slow-queriesund einzuschalten log-queries-not-using-indexes. Wenn Sie langsame Abfragen identifizieren, verwenden Sie die explainOption, um den Abfrageplan für diese Abfragen anzuzeigen und die Stellen zu identifizieren, an denen Indizes fehlen.

Weitere Informationen finden Sie unter http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html .

Code im Loch
quelle