[MySQL] Wie oft sollte man einen OPTIMIZE TABLE machen??



  • Hallo,

    ich habe eine MySQL-Datenbank, in der einige Tabellen sind, bei denen sich die Daten öffters ändern (hauptsächlich INSERT und DELETE). Dabei bleibt ja immer mal ein sog. Überhang übrig. Diese kann man mit OPTIMIZE TABLE wieder recht schön entfernen. Allerdings frage ich mich, wie oft man diesen OPTIMIZE TABLE anwenden sollte bzw. in welchen Zeitabständen und welche Zeitabstände sinnvoll wären. Es ist auch die Frage, ob es nicht die Performence einschränkt, wenn ständig ein OPTIMIZE TABLE drüberläuft.

    Habt ihr damit schon Erfahrung gemacht? Wann sollte man am besten einen OPTIMIZE TABLE absetzen?



  • Es kommtm darauf an wie groß deine Tables sind. Ein Optimize Table erstellt einen neuen Table mit den Daten des alten. Dabei ist auf dem alten ein Lock. Dh es kann keiner darauf zugreifen. Wenn dieser Dump fertig ist wir die alte gelscht und die neue umbenannt. Für diesen Zeitraum ist der Table nicht erreichbar. Da musst du erst sicherstellen das es mit anderen Programme kein Problem gibt. Je kleiner der Table desto schneller läuft das ganze ab. Suche dir am besten einen Zeitraum in der Nacht aus bei dem keine Zugriffe auf die DB erfolgen.



  • wie schlimm wirds eigentlich mit dem überhang? wächst der unbeschränkt weiter, oder bleibt der lieber irgendwann stehen bei nem wert, mit dem man leben kann? paßt die tabelle ohne überhang noch fein ins ram, mit aber nicht mehr? falls sie mit und ohne ins ram paßt, wird kein performanceverlust spürbar sein. falls sie mit und ohne deutlich nicht paßt, sollten die plattenzugriffe auch nur von der anzahl der datensätze abhängen (oder auch nicht, weil die nutzdaten außen liegen, der index aber satt im ram).
    denke, du mußt ausmessen, weil zu viele sachen reinspielen, die unbekannt sind. aber ich schätze, tägliches optimieren kostet mehr zeit, als es einspart.



  • Der Überhang sind Datensätze die zwar als gelöscht makiert aber noch im File vorhanden sind. Da man sowieso einen Index haben sollte (je nach Fall) macht es eigentlich nichts. Es kommt immer auf den Table an ob man Optimieren soll/muss. Bei Millionen Datensätzen sollte man dies ofters machen um die Tabledateie klien zu halten. Der überhang bleibt nicht stehen. Der wird immer größer.
    Eine Optimize auf 1 Mill. Datensätze mit ca. 10 Spalten dauert aber in MySQL auch nur wenige Sekunden.



  • ok, dann ignoriert meinen beitrag. bin echt nur tabellen gewohnt, wo der gelöschte speicher auch gleich wiederverwendet wird, wo also der überhang nur den bisherigen maximalspeicherbedarf angeben würde.



  • Welche Datenbank macht das ?
    IMHO ist das Löschen eines Datensatzes deshalb so geregelt weil man nicht einfach einen Teil aus den Files rauslöschen kann ohne die Datei neu zu schreiben.
    Hier wir ja in der Mitte einer Datei etwas verändert auch wenn es das RDBMS macht.
    Bei dbase war es sogar so das man die gelöschten Datensätze trotzdem zurückgeliefert bekommen hat.



  • Gut, danke für die Erklärungen. Da das ganze noch nicht genutzt wird, kann ich noch nicht genau sagen, wieviel Überhang produziert wird usw. Ich werde es wahrscheinlich erstmal anlaufen lassen und dann später entscheiden, ob ich überhaupt einen OPTIMIZE TABLE mache und wenn wann und wie oft ich ihn anwende bzw. an welcher Stelle.

    Nochmals Danke. Hat mir sehr geholfen.



  • Unix-Tom schrieb:

    Welche Datenbank macht das ?
    IMHO ist das Löschen eines Datensatzes deshalb so geregelt weil man nicht einfach einen Teil aus den Files rauslöschen kann ohne die Datei neu zu schreiben.

    die datensätze haben feste größe. locker kann man mittenraus einen satz als gelöscht markieren (nicht echt rauslöschen) und wenn man den nächsten satz einfügen will, den gerade freigemachten platz verwenden und mittenreinschreien in die datei.



  • Ich denke aber nicht das dies eine DB macht. IMHO geht ans Ende schreiben schneller.



  • Unix-Tom schrieb:

    Ich denke aber nicht das dies eine DB macht. IMHO geht ans Ende schreiben schneller.

    aber ich bin sicher, daß die jungs, die mysql gebaut haben, ein wenig programmieren können.



  • Verstehe dich jetzt nicht. MySQL schreibt IMHO nicht irgendwo in die Datei rein. Du sagtest das du eine DB kennst die das macht.



  • Unix-Tom schrieb:

    Verstehe dich jetzt nicht. MySQL schreibt IMHO nicht irgendwo in die Datei rein. Du sagtest das du eine DB kennst die das macht.

    bin doch schon wieder davon ausgegangen, dich bereits überzeugt zu haben, obwohl's noch nicht so war. mea culpa.

    http://www.mysql.com/doc/de/OPTIMIZE_TABLE.html

    OPTIMIZE TABLE sollte benutzt werden, wenn Sie große Teile der Tabelle gelöscht haben oder bei Tabellen mit Zeilen variabler Länge viele Änderungen durchgeführt haben (Tabellen, die VARCHAR-, BLOB- oder TEXT-Spalten enthalten). Gelöschte Datensätze werden in einer verknüpften Liste vorgehalten, und nachfolgenden INSERT-Operationen benutzen die Positionen alter Datensätze. Sie können OPTIMIZE TABLE benutzen, um unbenutzten Platz freizugeben und die Daten-Datei zu defragmentieren.

    na, damit ist doch alles klar. bei festbreitenfeldern kannste so viel einfügen und löschen, wie du magst. es wird immer der freie platz genommen, und wieder mittenrein geschrieben. und die tabelle ist so groß, wie ihre maximalgröße war.
    sinds felder variabler länge, dann geht's nicht so simpel, da muß als freispeicherverwaltung zum beispiel sowas her, wie für malloc/free verwendet wird. mit dem problem, daß der speicher fragmentiert. also ist's hier auch erstmal die maximalgröße und dazu noch overhead durch fragmentierung.
    also varchar und text in tabellen mit vielen deletes meiden, dann braucht man gar kein optimize.



  • Jetzt weiß ich was du meinst. Ich bin von VARCHAR-Tables ausgegangen.


Anmelden zum Antworten