Leeren von Feldern sinnvoll?

Hallo zusammen

Ich hab eine grosse (ca. 100’000 Datensätze) MyISAM-Tabelle in einer mySQL Datenbank.

Bei älteren Datensätze sind gewisse Informationen nicht mehr nötig; es wäre also möglich, diese Felder zu leeren oder auf Null zu setzen. Konkret könnte man so bei ca. 90 % der Datensätze 15 von 24 Felder leeren.

Wird dadurch weniger Festplattenspeicher benötigt? Und wäre das auch performance-mässig sinnvoll?

Liebe Grüsse,
Janosh

Hallo, Janosh!

Wird dadurch weniger Festplattenspeicher benötigt? Und wäre
das auch performance-mässig sinnvoll?

Kommt auf die Feldtypen an. Wenn Du nur die Werte rücksetzen willst, hilft Dir das nur, wenn Du Feldtypen variabler Länge hast. Bei Textfeldern der Länge 50 oder allen Zahlenfeldern z. B. werden in jedem Fall die 50 Bytes (oder bei Zahlen die dem Typ entsprechende Anzahl) reserviert. Ob da nun nix drinsteht oder 50 Buchstaben, ist egal.

Für die Performance kann sich sogar ein negativer Effekt ergeben: Wenn eins der zu löschenden Felder indiziert ist, aber alle Felder den gleichen Wert haben, wird das das Handling des Index nicht gerade vereinfachen. Indexe sind ja eigentlich nur sinnvoll, wenn man halbwegs unterschiedliche Werte hat. Wenn in einem Feld immer der gleiche Wert steht, brauche ich das Feld auch nicht zu indizieren.

Um definitiv Plattenplatz zu sparen, kannst Du nur die Felder löschen. Das könnte aber die nachgelagerten Programme ärgern, denen vielleicht egal ist, ob sie „“ oder „Hallo, hier Text“ anzeigen sollen, denen aber nicht egal ist, wenn sie das Feld „Bemerkung“ nicht finden.

Gruß, Manfred

Mahlzeit,

Für die Performance kann sich sogar ein negativer Effekt
ergeben: Wenn eins der zu löschenden Felder indiziert ist,
aber alle Felder den gleichen Wert haben, wird das das
Handling des Index nicht gerade vereinfachen.

also ich kenne das so, daß Nullwerte nicht indiziert werden. Ist das bei mySQL anders?

Gruß

Sancho

Danke für deine Antwort.

Keines der zu löschenden Felder ist indexiert.
Die meisten Feldtypen sind varchar(100). Werden da jetzt immer 100 Bytes reserviert, oder steht das für variabel mit Maximum 100?

Wenn die Grösse des db-Files kleiner ist, kann man dann auch davon ausgehen, dass die Performance besser wird?

Gruss,
Janosh

Mahlzeit,

Für die Performance kann sich sogar ein negativer Effekt
ergeben: Wenn eins der zu löschenden Felder indiziert ist,
aber alle Felder den gleichen Wert haben, wird das das
Handling des Index nicht gerade vereinfachen.

Hallo,

vorweg: ich kenne speziell mySQL nicht, aber ISAM-Dateien haben überall einen ähnlichen Aufbau und basieren auf gleiche Prinzipien.

Wenn die Grösse des db-Files kleiner ist, kann man dann auch
davon ausgehen, dass die Performance besser wird?

Das kann man ausschließen. ISAM-Dateien sind als doppelt verkettete Listen aufgebaut, d.h. in jedem Datensatz sind Informationen darüber vorhanden, an welcher Stelle der nächste Datensatz anfängt bzw. der vorherige. Die Anzahl der Datensätze wirkt sich auf die Performance aus, aber die Anzahl der Spalten nicht (es wird halt woanders verwiesen).

Ein Index erspart der Datenbank das Durchhangeln über alle Datensätze. Aber auch hier ist die Anzahl der (am Index nicht beteiligten) Spalten ziemlich egal.

Gruß

Sancho

Hallo, Janosh!

Keines der zu löschenden Felder ist indexiert.
Die meisten Feldtypen sind varchar(100). Werden da jetzt immer
100 Bytes reserviert, oder steht das für variabel mit Maximum
100?

varchar müsste sein, dass gewisse Verwaltungsbytes (bei Access-Memofeld wären das vier, glaube ich) wie die Größe in jedem Fall vorhanden sind und darüber hinaus nur die Bytes benötigt werden, die der Text auch lang ist. Es werden also Länge(Text)+x(konstant) Bytes benötigt.

@Sancho: Ob NULL-Werte indiziert werden, bezweifle ich auch, jedenfalls wäre das logisch. (Aber zum Thema Logik und Computer lasse ich mich auf nichts mehr ein, seit ich MS kennen.) Aber ob „“ indiziert wird, weiß ich nicht.

Wenn die Grösse des db-Files kleiner ist, kann man dann auch
davon ausgehen, dass die Performance besser wird?

Theoretisch schon. Aber in jedem Fall hängt die Performance wesentlich von der Datenbankarchitektur ab, und die sollte man dann ziemlich genau im Detail kennen. Die einzig wirklich verlässliche Aussage gibt’s nur durch ausprobieren.

Gruß, Manfred

Okay, danke für eure Antworten.

Haber gerade noch gelesen, dass die Varchars erst dann wirklich weniger Platz benötigen, wenn die Tabelle explizit mit ‚optimize‘ defragmentiert wurde.

Im Prinzip kann ich durch Zusammenfassen alter Daten auch ganze Datensätze einsparen. Dies sollte ja demnach viel stärker eine Auswirkung auf die Performance haben.

Gruss,
Janosh