Wie behebe ich das Overhead und Effective Problem in der InnoDB Tabelle?

8

Fragen:

1 - Was bedeutet Overhead? Wenn ich auf die Schaltfläche "Tabelle optimieren" in der MyISAM-Tabelle klicke, sind Overhead- und Effective-Daten verloren. Ich frage mich, was es mit meinem Tisch macht?

2 - Muss ich mich wirklich um Overhead und Effective Value kümmern? Wie man das Obenliegende und wirkungsvolle Problem auf InnoDB Tabelle repariert?

    
zac1987 15.08.2011, 18:31
quelle

2 Antworten

8

Das Fixieren von InnoDB ist nicht so trivial wie ein Klick auf einen Button. MyISAM ist.

Unter der Haube wird OPTIMIZE TABLE dies für eine MyISAM-Tabelle tun namens mytb:

  • Erstellen Sie eine leere temporäre Tabelle mit derselben Struktur wie mytb
  • Kopieren Sie MyISAM-Daten von mytb in die temporäre Tabelle
  • Ablagetisch mytb
  • Benennen Sie die temporäre Tabelle in mytb
  • um
  • Führen Sie ANALYZE TABLE gegen mytb aus und speichern Sie die Indexstatistiken

OPTMIZE TABLE funktioniert aus zwei Gründen nicht mit InnoDB:

GRUND # 1: InnoDB-Speicherlayout

Standardmäßig hat InnoDB innodb_file_per_table deaktiviert. Alles, was InnoDB und seine Großmutter in ibdata1 landen. Das Ausführen von OPTIMIZE TABLE führt zu einer InnoDB-Tabelle, die als Mytb bezeichnet wird:

  • Erstellen Sie eine leere InnoDB-Tempentabelle mit derselben Struktur wie mytb
  • Kopieren Sie InnoDB-Daten von mytb in die temporäre Tabelle
  • Ablagetisch mytb
  • Benennen Sie die temporäre Tabelle in mytb
  • um
  • Führen Sie ANALYZE TABLE gegen mytb aus und speichern Sie Indexstatistiken

Leider wird die für das Schrumpfen von mytb verwendete temporäre Tabelle an ibdata1 angehängt. SOFORTIGES WACHSTUM FÜR ibdata1 !!! Angesichts dessen wird Ibdata1 niemals schrumpfen. Schlimmer noch, ANALYZE TABLE ist nutzlos (erklärt in Grund # 2)

Wenn innodb_file_per_table aktiviert ist, funktionieren die ersten vier (4) Schritte, da die Daten nicht in ibdata1 gespeichert werden, sondern in einer externen Tablespace-Datei namens mytb.ibd. Das kann schrumpfen.

GRUND Nr. 2: Indexstatistiken werden immer neu berechnet

InnoDB speichert Indexstatistiken nicht effektiv. Wenn Sie ANALYZE TABLE auf mytb ausführen, werden Statistiken erstellt und gespeichert. Leider wird InnoDB von Entwurf aus in die BTREE-Seiten seiner Indizes einsteigen, erraten -Kardinalitäten, und diese Zahlen verwenden, um den MySQL-Abfrageoptimierer vorzubereiten. Dies ist ein fortlaufender Prozess. Tatsächlich ist ANALYZE TABLE nutzlos, da die berechneten Indexstatistiken bei jeder Abfrage überschrieben werden, die für diese Tabelle ausgeführt wird. Ich habe darüber im DBA StackExchange geschrieben 21. Juni 2011 .

Percona erklärte dies ausführlich im www .mysqlperformanceblog.com

Wie für Overhead in MyISAM kann diese Nummer herausgefunden werden.

Bei einer MyISAM-Tabelle repräsentiert der Overhead die interne Fragmentierung. Dies ist in einer Tabelle, in der INSERT-, UPDATE- und DELETE-Ereignisse auftreten, ziemlich häufig, insbesondere wenn Sie BLOB-Daten oder VARCHAR-Spalten haben. Wenn Sie OPTIMIZE TABLE ausführen, wird diese Fragmentierung durch Kopieren in eine temporäre Tabelle ausgeblendet (wobei natürlich kein leerer Bereich kopiert wird).

Gehen Sie zurück zu InnoDB, wie beseitigen Sie effektiv überflüssigen Platz? Sie müssen ibdata1 rearchitect, um weniger Informationen zu halten. Mit ibdata1 haben Sie vier Arten von Daten:

  • Tabellendatenseiten
  • Indexdatenseiten
  • Tabelle MetaData
  • MVCC-Daten für Transaktionen

Sie können Tabelle und Indizes für immer aus ibdata1 perma- nent verschieben. Was ist mit Daten und Indizes, die bereits in ibdata1 untergebracht sind?

Folgen Sie dem InnoDB-Bereinigungsplan, den ich am 29. Oktober 2010 veröffentlicht habe: Howto: Reinigen Sie eine MySQL InnoDB Storage Engine?

    
RolandoMySQLDBA 15.08.2011, 20:00
quelle
1

Tatsächlich ist "OPTIMIZE TABLE" eine unnütze Zeitverschwendung auf MyISAM, denn wenn Sie es tun müssen, ist Ihre Datenbank bereits getoast.

Es dauert sehr lange auf großen Tabellen und blockiert währenddessen Schreibzugriff auf die Tabelle. Außerdem hat es sehr böse Auswirkungen auf den Myisam Keycache etc.

Also zusammenfassend

  • kleine Tabellen brauchen nie "Tabelle optimieren"
  • große Tabellen können niemals "Tabelle optimieren" (oder tatsächlich MyISAM)
  • verwenden

Es ist möglich, (in etwa) dasselbe in InnoDB zu erreichen, indem einfach eine ALTER TABLE-Anweisung verwendet wird, die keine Schemaänderungen vornimmt (normalerweise ALTER TABLE t ENGINE = InnoDB). Es ist nicht so schnell wie MyISAM, weil es nicht die verschiedenen Small-Table-Speicheroptimierungen durchführt.

MyISAM verwendet auch eine Reihe von Indexoptimierungen, um Indexseiten zu komprimieren, die im Allgemeinen recht kleine Indizes verursachen. InnoDB hat diese auch nicht.

Wenn Ihre Datenbank klein ist, brauchen Sie sie nicht. Wenn es groß ist, können Sie MyISAM sowieso nicht wirklich verwenden (weil ein ungeplantes Herunterfahren dazu führt, dass die Tabelle neu erstellt werden muss, was bei großen Tabellen zu lange dauert). Verwenden Sie MyISAM einfach nicht, wenn Sie Haltbarkeit, Zuverlässigkeit, Transaktionen, eine beliebige Nebenläufigkeit oder allgemeine Robustheit in irgendeiner Weise benötigen.

    
MarkR 20.08.2011 22:21
quelle

Tags und Links