Wäre es für die Leistung besser oder schlechter, diese Datei in kleinere Teile (z. B. 4G) aufzuteilen?
Nachito
Antworten:
13
Wenn dies ein Problem sein kann
Wenn Sie show table statusauf einer Tabelle ausgeführt werden und das Data_freeFeld den größten Teil der ibdata1Dateigröße ausmacht, wird möglicherweise viel Speicherplatz verschwendet. Durch viel Einfügen / Löschen wird dies zu einem Problem. Wenn dies der Fall ist und vorübergehende Einfügungen und Löschungen den Großteil Ihrer Daten ausmachen, haben Sie ein gutes Argument für eine Datei pro Tabelle.
Das ist jedoch kein automatisches "Ja". Es wird weltweit viel über die interne Fragmentierung in InnoDB-Dateien gesprochen, aber wenn Sie sie als Datei pro Tabelle in ein Dateisystem einfügen, wird Ihre Fragmentierung nur auf die Dateisystemebene anstatt auf die Datenbankebene verschoben.
Warum dies normalerweise kein Problem ist
Stellen Sie sich Ihre InnoDB-Datei als Dateisystem und nicht als Datei vor. Wenn Sie viele Dateien haben, benötigen Sie ein großes Dateisystem.
Zum größten Teil können Dateisysteme sehr gut skaliert werden, um Terabyte an Daten und unzählige Dateien zu verarbeiten. Manchmal treten Probleme mit einer schlechten Indizierung auf (z. B. Begrenzung der Anzahl der Dateien in einem Verzeichnis vor einer Auswirkung auf die Leistung), aber zum größten Teil kann das moderne Dateisystem weit in den Terabyte-Bereich vordringen.
InnoDB funktioniert genauso. Die Größe Ihrer Datendatei kann sehr groß sein ... und wie bei großen Dateisystemen kann dies zu Problemen beim Sichern Ihrer Daten führen. Genauso wie das Aufteilen Ihres Dateisystems in mehrere Partitionen bei diesem Problem nicht hilft, hilft auch nicht der Versuch, innodb zu manipulieren. Obwohl Sie innodb_file_per_table verwenden können , empfehle ich es selten.
Ähnlich wie bei Ihrem Dateisystem besteht die bessere Antwort darin, die Grenzen intern zu kennen und darin zu arbeiten. Indizes verstehen und entsprechend anwenden. Versuchen Sie nicht, InnoDB aufzuteilen, es ist nicht dafür gedacht.
Ich erinnere mich an eine wirklich sehr alte MySQL-Marketingfolie, auf der der Kunde ein Data Warehouse mit einigen Terabyte betrieb. Vor vielen Jahren. InnoDB oder MyISAM, beide würden funktionieren. Dies ist Standard MySQL-Zeug von der Stange.
Es sieht so aus, als wäre ich zu knapp 50% ausgelastet. InnoDB free: 7364608 kB
Nachito
@nachito Das klingt so, als ob es in Ordnung sein sollte. Wenn Sie der Meinung sind, dass Sie den Speicherplatz für das Dateisystem wieder benötigen, fordern Sie ihn zurück. Wenn Sie sich nur Sorgen um die Leistung machen, tun Sie es nicht. Aus Gründen der Leistung ist es außerdem am besten, Ihre Datenbankdateien auf einer eigenen Partition zu belassen. Wenn Sie sich also auf die Leistung konzentrieren, wird ohnehin keine brauchbare Rückforderung angezeigt.
Jeff Ferland
6
ibdata-Dateien werden nicht verkleinert. Wenn Sie kürzlich einige Tabellen gelöscht oder viele Zeilen entfernt haben, gibt innodb in Ihrer Konfiguration den freien Speicherplatz nicht an das Dateisystem zurück. Ich würde dir vorschlagen:
Sichern Sie alle Ihre Daten, z. B. mit mysqldump
zur Anweisung my.cnf innodb_file_per_table hinzufügen
Starten Sie MySQL neu
Löschen Sie alle Datenbanken mit der innodb engine
hör auf mysql
Entfernen Sie die ibdata-Datei
rm ib_logfile [01]
Starten Sie MySQL und überprüfen Sie Syslog, ob alles in Ordnung ist
Laden Sie Ihren Dump neu
Auf diese Weise können Sie den Speicherplatz zurückfordern, wenn Sie eine Innodb-Tabelle / Datenbank löschen. Zugeordnete IDB-Dateien werden sofort entfernt.
Ich verstehe, dass es niemals schrumpfen wird, ohne die Tabellen zu entleeren und neu zu laden. Wenn ich jedoch InnoDB-Datenbanken gelöscht habe, wird dieser "freie" Speicherplatz verwendet, bevor er wieder wächst?
Ihre Antwort ist nur ein einfacher Vorschlag, ohne das Problem zu trüben, wie es meine Antwort anscheinend getan hat. +1 !!!
RolandoMySQLDBA
1
Nun, die Antwort ist eine Lösung, um den von den Datendateien belegten Speicherplatz zu reduzieren, aber es ist keine Diskussion über die damit verbundenen Vorteile, und das ist die Frage, wie ich sie lese. Ist eine 15-GB-Ibdata-Datei eine große Sache?
Antworten:
Wenn dies ein Problem sein kann
Wenn Sie
show table status
auf einer Tabelle ausgeführt werden und dasData_free
Feld den größten Teil deribdata1
Dateigröße ausmacht, wird möglicherweise viel Speicherplatz verschwendet. Durch viel Einfügen / Löschen wird dies zu einem Problem. Wenn dies der Fall ist und vorübergehende Einfügungen und Löschungen den Großteil Ihrer Daten ausmachen, haben Sie ein gutes Argument für eine Datei pro Tabelle.Das ist jedoch kein automatisches "Ja". Es wird weltweit viel über die interne Fragmentierung in InnoDB-Dateien gesprochen, aber wenn Sie sie als Datei pro Tabelle in ein Dateisystem einfügen, wird Ihre Fragmentierung nur auf die Dateisystemebene anstatt auf die Datenbankebene verschoben.
Warum dies normalerweise kein Problem ist
Stellen Sie sich Ihre InnoDB-Datei als Dateisystem und nicht als Datei vor. Wenn Sie viele Dateien haben, benötigen Sie ein großes Dateisystem.
Zum größten Teil können Dateisysteme sehr gut skaliert werden, um Terabyte an Daten und unzählige Dateien zu verarbeiten. Manchmal treten Probleme mit einer schlechten Indizierung auf (z. B. Begrenzung der Anzahl der Dateien in einem Verzeichnis vor einer Auswirkung auf die Leistung), aber zum größten Teil kann das moderne Dateisystem weit in den Terabyte-Bereich vordringen.
InnoDB funktioniert genauso. Die Größe Ihrer Datendatei kann sehr groß sein ... und wie bei großen Dateisystemen kann dies zu Problemen beim Sichern Ihrer Daten führen. Genauso wie das Aufteilen Ihres Dateisystems in mehrere Partitionen bei diesem Problem nicht hilft, hilft auch nicht der Versuch, innodb zu manipulieren. Obwohl Sie innodb_file_per_table verwenden können , empfehle ich es selten.
Ähnlich wie bei Ihrem Dateisystem besteht die bessere Antwort darin, die Grenzen intern zu kennen und darin zu arbeiten. Indizes verstehen und entsprechend anwenden. Versuchen Sie nicht, InnoDB aufzuteilen, es ist nicht dafür gedacht.
Da ich Schwierigkeiten habe, das Konzept konstruktiv zu vermitteln, lesen wir hier kurz, dass Wörter so besser sind als ich: Terabyte sind keine großen Datenmengen, Petabyte .
Schwitzen Sie nicht eine 15 GB Datenbank.
quelle
InnoDB free: 7364608 kB
ibdata-Dateien werden nicht verkleinert. Wenn Sie kürzlich einige Tabellen gelöscht oder viele Zeilen entfernt haben, gibt innodb in Ihrer Konfiguration den freien Speicherplatz nicht an das Dateisystem zurück. Ich würde dir vorschlagen:
Auf diese Weise können Sie den Speicherplatz zurückfordern, wenn Sie eine Innodb-Tabelle / Datenbank löschen. Zugeordnete IDB-Dateien werden sofort entfernt.
quelle