Maximale Anzahl von Datensätzen in einer MySQL-Datenbanktabelle

174

Was ist die Obergrenze für Datensätze für die MySQL-Datenbanktabelle? Ich frage mich über das Autoincrement-Feld. Was würde passieren, wenn ich Millionen von Datensätzen hinzufüge? Wie gehe ich mit solchen Situationen um? Vielen Dank!

xpepermint
quelle
16
Ganz zu schweigen von den 1.21 GIGAWATTS!
Ben
2
Zumindest wenn Speicher zur Verfügung steht, wird das Limit von der Speicher-Engine festgelegt, sodass Sie (zum Beispiel) mit MyISAM ein anderes Limit erhalten als mit InnoDB.
Jerry Coffin
77
@ Onion-Knight: Ich stimme nicht zu. Es ist normal, Millionen von Zeilen in eine einzelne Tabelle einzufügen , und einige Datenbanken haben ein Limit. Es lohnt sich also zu fragen. Wenn man fragt, ob MySQL Millionen von Tabellen unterstützt , ist dies wahrscheinlich ein Zeichen für einen Architekturfehler.
Bill Karwin

Antworten:

61

mysql int-Typen können einige Zeilen ausführen: http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

unsigned intgrößte Wert ist 4,294,967,295
unsigned bigintgrößte Wert ist18,446,744,073,709,551,615

KM.
quelle
8
2147483647 max. Müssen Sie also nur dann Autoincrement bigint machen, wenn Sie mit mehreren Milliarden Einträgen arbeiten? (was wahrscheinlich nur dazu führen würde, dass Ihre ausgewählten Aussagen lange vorher schmelzen)
Kzqai
2
@Tchalvak, das für signierte int ist, lesen Sie bitte die MySQL-Dokumentation.
Leandro
8
Im Kontext der Frage geht es darum, ob das Feld für das automatische Inkrementieren viele Zeilen verarbeiten kann und nicht um die Einschränkungen anderer Ressourcen
KM.
21
Das Poster fragt nicht nach numerischen oder anderen Datentypen. . Ich verstehe wirklich nicht, wie dies als richtige Antwort gekennzeichnet werden kann. Obwohl ich zugeben muss, dass die Frage nicht eindeutig ist, sollten wir zwischen dem PK-Datentyp und der maximalen Anzahl von Zeilen für eine Tabelle unterscheiden.
Bery
1
@Bery, das OP hat unterschieden, wonach sie gesucht haben, indem es dies als ihre Antwort ausgewählt hat. Anscheinend waren sie an der Kapazität des Feldes für die automatische Inkrementierung interessiert, das meine Antwort abdeckt, und nicht an den Einschränkungen anderer Ressourcen.
KM.
238

Der größte Wert einer Ganzzahl hat wenig mit der maximalen Anzahl von Zeilen zu tun, die Sie in einer Tabelle speichern können.

Wenn Sie ein int oder bigint als Primärschlüssel verwenden, können Sie zwar nur so viele Zeilen wie die Anzahl der eindeutigen Werte im Datentyp Ihres Primärschlüssels haben, aber Sie müssen Ihren Primärschlüssel nicht zu einer Ganzzahl machen , du könntest es zu einem CHAR (100) machen. Sie können den Primärschlüssel auch über mehrere Spalten deklarieren.

Neben der Anzahl der Zeilen gibt es noch andere Einschränkungen für die Tabellengröße. Beispielsweise könnten Sie ein Betriebssystem verwenden, für das die Dateigröße begrenzt ist. Oder Sie haben eine 300-GB-Festplatte, auf der nur 300 Millionen Zeilen gespeichert werden können, wenn jede Zeile 1 KB groß ist.

Die Grenzen der Datenbankgröße sind sehr hoch:

http://dev.mysql.com/doc/refman/5.1/en/source-configuration-options.html

Die MyISAM-Speicher-Engine unterstützt 2 32 Zeilen pro Tabelle. Sie können MySQL jedoch mit der --with-big-tablesOption erstellen, bis zu 2 64 Zeilen pro Tabelle zu unterstützen.

http://dev.mysql.com/doc/refman/5.1/en/innodb-restrictions.html

Die InnoDB-Speicher-Engine scheint die Anzahl der Zeilen nicht zu begrenzen, die Tabellengröße jedoch auf 64 Terabyte. Wie viele Zeilen dazu passen, hängt von der Größe jeder Zeile ab.

Bill Karwin
quelle
62
Mist - ich wünschte, ich hätte das schon einmal gelesen ... Ich habe gerade meine 64-Terrabyte-Größe auf einem meiner Tische überschritten und jetzt ist mein System so langsam!
JM4
2 ^ 32 = 4,294,967,295 und 2 ^ 64 = 18,446,744,073,709,551,615 also ... Der größte ganzzahlige Wert hat etwas mit der maximalen Anzahl von Zeilen zu tun. Nicht unbedingt der Primärschlüssel.
Teynon
1
@ Tom, InnoDB ist die Standard-Speicher-Engine in MySQL 5.5 und in 99% der Fälle die bessere Wahl.
Bill Karwin
2
@ Ext3h, Sphinx Search ist normalerweise die bessere Wahl als Volltextindizes in MyISAM oder InnoDB.
Bill Karwin
1
Für MySQL 8 beträgt das Limit 256 TB bei einer Seitengröße von 64 KB.
UselesssCat
13

Ich schlage vor, niemals Daten zu löschen. Sagen Sie nicht, wenn die Tabellen länger als 1000 sind, schneiden Sie das Ende der Tabelle ab. Ihr Plan muss eine echte Geschäftslogik enthalten, z. B. wie lange dieser Benutzer inaktiv war. Wenn es beispielsweise länger als 1 Jahr ist, legen Sie sie in eine andere Tabelle. Dies würde wöchentlich oder monatlich in einem Wartungsskript mitten in einer langsamen Zeit geschehen.

Wenn Sie auf zu viele Zeilen in Ihrer Tabelle stoßen, sollten Sie mit dem Sharding der Tabellen oder der Partitionierung beginnen und alte Daten nach Jahr in alte Tabellen einfügen, z. B. users_2011_jan, users_2011_feb, oder Zahlen für den Monat verwenden. Ändern Sie dann Ihre Programmierung, um mit diesem Modell zu arbeiten. Erstellen Sie möglicherweise eine neue Tabelle mit weniger Informationen, um die Daten in weniger Spalten zusammenzufassen, und verweisen Sie dann nur dann auf die größeren partitionierten Tabellen, wenn Sie mehr Informationen benötigen, z. B. wenn der Benutzer sein Profil anzeigt. All dies sollte sehr sorgfältig abgewogen werden, damit es in Zukunft nicht zu teuer ist, es neu zu faktorisieren. Sie können auch nur die Benutzer, die ständig zu Ihrer Site kommen, in eine Tabelle und die Benutzer, die niemals in einen archivierten Satz von Tabellen kommen, zusammenfassen.

PHPGuru
quelle
1
In dieser Hinsicht ist es sehr nützlich, sich die MySQL-Partitionierung anzusehen
Wim Deblauwe
10

In InnoDB können mit einer Beschränkung der Tabellengröße von 64 Terabyte und einer Beschränkung der MySQL-Zeilengröße von 65.535 1.073.741.824 Zeilen vorhanden sein. Dies wäre eine minimale Anzahl von Datensätzen unter Verwendung der maximalen Zeilengrößenbeschränkung. Es können jedoch weitere Datensätze hinzugefügt werden, wenn die Zeilengröße kleiner ist.

Xylo
quelle
Wie viel Festplattengröße ist erforderlich, um so viele (1.073.741.824) Zeilen mit einem Zeilenlimit von 65535 zu speichern? Bitte vorschlagen
Davidb
1
Die erforderliche Festplattengröße kann nicht allein anhand der Anzahl der Zeilen und der Zeilengröße bestimmt werden. Die Tabellengröße selbst beträgt 64 Terabyte. Die Daten der TEXT- und BLOB-Spalten werden jedoch getrennt von der Zeile gespeichert und benötigen zusätzlichen Speicherplatz. Darüber hinaus hängt dies von der Anzahl und dem Typ der TEXT- und BLOB-Spalten ab, da die Größe je nach Typ variiert. Es gibt vier Arten von TEXT-Spalten: TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT. Es gibt auch vier Arten von BLOB-Spalten, nämlich TINYBLOB, MEDIUMBLOB, BLOB und LONGBLOB.
Xylo
2

Gemäß dem Abschnitt Skalierbarkeit und Einschränkungen unter http://dev.mysql.com/doc/refman/5.6/en/features.html unterstützt MySQL große Datenbanken. Sie verwenden MySQL Server mit Datenbanken, die 50 Millionen Datensätze enthalten. Einige Benutzer verwenden MySQL Server mit 200.000 Tabellen und etwa 5.000.000.000 Zeilen.

Daten
quelle
Es könnte hilfreich sein, wenn Sie uns auch
mitteilen
In der Tat, Sie haben Recht. Aber leider haben 'sie' nichts über die Hardware gesagt
Daten
@myaccount_ram Entschuldigung, dies zu nekromantieren, aber wenn es hilfreich ist, habe ich die weniger theoretischen, praktischeren Grenzen der Produktion von MySQL in Aktion gesehen. Ich habe eine Datenbank gesehen, die ~ 18 Milliarden Zeilen auf 2x db.r4.16xlarge AWS-Instanzen umfasst (1 Leser, 1 Schreiber). Jeder der Computer hatte 64 CPU-Kerne, 488 GB RAM, eine 25-Gbit / s-Netzwerkverbindung und 64 TB Festplatte. Diese Datenbankskala hat sowohl die CPU- als auch die Festplattengrößenbeschränkungen überschritten, und AWS bietet keine größeren DB-optimierten Instanzen. Es wurde durch ein einfacheres Datenbankschema ersetzt, für das nicht so viele Zeilen erforderlich waren.
Skylar Brown vor
1

Zeilengrößenbeschränkungen

The maximum row size for a given table is determined by several factors:
  • Die interne Darstellung einer MySQL-Tabelle hat eine maximale Zeilengrößenbeschränkung von 65.535 Byte, selbst wenn die Speicher-Engine größere Zeilen unterstützen kann. BLOB- und TEXT-Spalten tragen nur 9 bis 12 Byte zur Zeilengrößenbeschränkung bei, da ihr Inhalt getrennt vom Rest der Zeile gespeichert wird.

  • Die maximale Zeilengröße für eine InnoDB-Tabelle, die für lokal auf einer Datenbankseite gespeicherte Daten gilt, beträgt etwas weniger als eine halbe Seite. Beispielsweise beträgt die maximale Zeilengröße etwas weniger als 8 KB für die standardmäßige InnoDB-Seitengröße von 16 KB, die durch die Konfigurationsoption innodb_page_size definiert wird. " Grenzen für InnoDB-Tabellen ".

  • Wenn eine Zeile mit Spalten variabler Länge die maximale Zeilengröße von InnoDB überschreitet, wählt InnoDB Spalten variabler Länge für den externen Off-Page-Speicher aus, bis die Zeile innerhalb der InnoDB-Zeilengrößenbeschränkung liegt. Die Datenmenge, die lokal für Spalten variabler Länge gespeichert wird, die außerhalb der Seite gespeichert werden, unterscheidet sich je nach Zeilenformat. Weitere Informationen finden Sie unter „ InnoDB-Zeilenspeicher und Zeilenformate “.
  • Unterschiedliche Speicherformate verwenden unterschiedliche Mengen an Seitenkopf- und Trailerdaten, was sich auf die für Zeilen verfügbare Speichermenge auswirkt.
Saurabh Chandra Patel
quelle
1

Link http://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html

Zeilengrößenbeschränkungen

Die maximale Zeilengröße für eine bestimmte Tabelle wird von mehreren Faktoren bestimmt:

Die interne Darstellung einer MySQL-Tabelle hat eine maximale Zeilengrößenbeschränkung von 65.535 Byte, selbst wenn die Speicher-Engine größere Zeilen unterstützen kann. BLOB- und TEXT-Spalten tragen nur 9 bis 12 Byte zur Zeilengrößenbeschränkung bei, da ihr Inhalt getrennt vom Rest der Zeile gespeichert wird.

Die maximale Zeilengröße für eine InnoDB-Tabelle, die für lokal auf einer Datenbankseite gespeicherte Daten gilt, beträgt etwas weniger als eine halbe Seite für die Einstellungen innodb_page_size mit 4 KB, 8 KB, 16 KB und 32 KB. Beispielsweise beträgt die maximale Zeilengröße etwas weniger als 8 KB für die standardmäßige InnoDB-Seitengröße von 16 KB. Bei 64-KB-Seiten beträgt die maximale Zeilengröße etwas weniger als 16 KB. Siehe Abschnitt 15.8.8, „Grenzwerte für InnoDB-Tabellen“.

Wenn eine Zeile mit Spalten variabler Länge die maximale Zeilengröße von InnoDB überschreitet, wählt InnoDB Spalten variabler Länge für den externen Off-Page-Speicher aus, bis die Zeile innerhalb der InnoDB-Zeilengrößenbeschränkung liegt. Die Datenmenge, die lokal für Spalten variabler Länge gespeichert wird, die außerhalb der Seite gespeichert werden, unterscheidet sich je nach Zeilenformat. Weitere Informationen finden Sie in Abschnitt 15.11, „InnoDB-Zeilenspeicher und Zeilenformate“.

Unterschiedliche Speicherformate verwenden unterschiedliche Mengen an Seitenkopf- und Trailerdaten, was sich auf die für Zeilen verfügbare Speichermenge auswirkt.

Informationen zu InnoDB-Zeilenformaten finden Sie in Abschnitt 15.11, „InnoDB-Zeilenspeicher und Zeilenformate“ und Abschnitt 15.8.3, „Physikalische Zeilenstruktur von InnoDB-Tabellen“.

Informationen zu MyISAM-Speicherformaten finden Sie in Abschnitt 16.2.3, „MyISAM-Tabellenspeicherformate“.

http://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html

Md Nazrul Islam
quelle
-3

Es gibt keine Grenzen. Dies hängt nur von Ihrem freien Speicher und der maximalen Dateigröße des Systems ab. Dies bedeutet jedoch nicht, dass Sie keine Vorsichtsmaßnahmen treffen sollten, um die Speichernutzung in Ihrer Datenbank zu bekämpfen. Erstellen Sie immer ein Skript, mit dem nicht verwendete Zeilen gelöscht werden können oder das insgesamt keine Zeilen innerhalb einer bestimmten Zahl enthält, z. B. tausend.

9jamkt
quelle
8
Das Löschen von Zeilen, von denen Sie glauben, dass sie nicht mehr verwendet werden, ist gefährlich und verursacht weit mehr Probleme als es löst. Ein früherer Entwickler eines meiner Projekte implementierte ein Skript, mit dem Einkaufswagen gelöscht wurden, die älter als drei Tage waren, und dachte, er würde das Richtige tun. Ratet mal, es verursacht wöchentlich Probleme. Löschen Sie Daten nur, wenn Sie es wirklich brauchen.
Ben Hitchcock
Ein schlimmerer Fall ist, wenn jemand anfängt, Dateipfade in einer Datenbank zu speichern ... Heu, wo sind alle meine Projektdateien geblieben ... Ich habe ein kleines Projekt, das bei 3,5 Millionen Dateien beginnt. Ratet mal, was ... sie sind nicht alle häufig verwendet.
Kendrick