Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verständnis der MyISAM-Datensatzstruktur

Die Informationen, die Sie in der Frage zu MyISAM haben, sind genau richtig. Ich möchte jedoch auf Ihre zwei zusätzlichen Fragen eingehen:

LETZTE FRAGE

Laut dem Buch

Kapitel 10:"Speicher-Engines" Seite 196 Absatz 7 sagt:

Basierend auf diesem Absatz wird der alte Datensatz nur dann mit Verknüpfungsdaten überschrieben, wenn die neuen einzufügenden Daten nicht in den zuvor zugewiesenen Block passen. Dies kann zu vielen aufgeblähten Zeilen führen.

ZUSATZFRAGE

Aus meiner vorherigen Antwort würde es viele Blöcke geben, die

  • Raumblock
  • die Länge des Datensatzes
  • die Anzahl der ungenutzten Bytes im Block
  • NULL-Wert-Indikator-Flags
  • evtl. ein Hinweis auf die Fortsetzung des Datensatzes, falls der Datensatz nicht in den zuvor geschaffenen Platz passte und aufgeteilt werden musste

Solche Datensatzverknüpfungen würden vor jeder Zeile beginnen, in die übergroße Daten eingefügt werden. Dies kann MyISAM-Tabellen .MYD aufblähen Datei sehr schnell.

VORSCHLÄGE

Das Standard-Zeilenformat eines MyISAM ist Dynamisch. Wenn eine Tabelle dynamisch ist und viele INSERTs, UPDATEs und DELETEs erfährt, müsste eine solche Tabelle mit

optimiert werden
OPTIMIZE TABLE mytable;

Es gibt eine Alternative:Stellen Sie das Zeilenformat der Tabelle auf Fixed um. Auf diese Weise sind alle Zeilen gleich groß. So machen Sie das Zeilenformat fest:

ALTER TABLE mytable ROW_FORMAT=Fixed;

Selbst bei einem festen Zeilenformat muss Zeit aufgewendet werden, um einen verfügbaren Datensatz zu finden, aber die Zeit wäre O (1) Suchzeit (In Laienbegriffen würde es die gleiche Zeit dauern, einen verfügbaren Datensatz zu finden, egal wie viele Zeilen die Tabelle hat oder wie viele gelöschte Zeilen es gibt). Sie könnten diesen Schritt umgehen, indem Sie concurrent_insert wie folgt:

Fügen Sie dies zu my.cnf hinzu

[mysqld]
concurrent_insert = 2

MySQL-Neustart nicht erforderlich. Einfach laufen

mysql> SET GLOBAL concurrent_insert = 2;

Dies würde dazu führen, dass alle INSERTs ans Ende der Tabelle gehen, ohne nach freiem Speicherplatz zu suchen.

Vorteil fester Zeilentabellen

  • INSERT, UPDATE und DELETE wären etwas schneller
  • SELECT sind 20–25 % schneller

Hier sind einige meiner Beiträge zu SELECT, das schneller ist, wenn Zeilenformate korrigiert werden

Nachteil fester Zeilentabellen

In den meisten Fällen, wenn Sie ALTER TABLE mytable ROW_FORMAT=Fixed; ausführen , kann die Tabelle um 80-100 % wachsen. Die .MYI Datei (Indexseiten für die MyISAM-Tabelle) würde ebenfalls mit der gleichen Rate wachsen.

EPILOG

Wenn Sie Geschwindigkeit für MyISAM-Tabellen wollen und mit größeren Tabellen leben können, wären meine alternativen Vorschläge erforderlich. Wenn Sie Speicherplatz für jede MyISAM-Tabelle sparen möchten, lassen Sie das Zeilenformat unverändert (dynamisch). Sie müssen die Tabelle mit OPTIMIZE TABLE mytable; komprimieren häufiger mit dynamischen Tabellen.