Mysql: Speicherbedarf einzelner Datensätze
Stefan
- datenbank
Hallo,
wie kann ich den Speicherbedarf einzelner Datensätze in MySQL-Tabellen ermitteln?
Ich habe eine gegebene Abfrage, z.B, "SELECT * FROM MeineTabelle WHERE Bedingung;", habe, dann würde ich gerne wissen, wieviel Platz auf der Festplatte der so ausgewählte Datensatz belegt. Wird kein Datensatz gefunden, dann muss natürlich 0 rauskommen, werden mehrere Datensätze gefunden, dann der von insgesamt von diesen Datensätzen belegte Speicherplatz.
Wie kann ich das ermitteln?
Stefan
Hi
Aus dem MySQL-Handbuch
<cite>
Speicherbedarf von Spaltentypen
Der Speicherbedarf jedes Spaltentyps, der von MySQL unterstützt wird, ist unten nach Kategorie
sortiert aufgelistet:
Speicherbedarf für numerische Typen
Speicherbedarf für Datums- und Zeit-Typen
Speicherbedarf für Zeichenketten-Typen
Spaltentyp Speicherbedarf
TINYINT 1 Byte
SMALLINT 2 Bytes
MEDIUMINT 3 Bytes
INT 4 Bytes
INTEGER 4 Bytes
BIGINT 8 Bytes
FLOAT(X) 4, wenn X <= 24, oder 8, wenn 25 <= X <= 53
FLOAT 4 Bytes
DOUBLE 8 Bytes
DOUBLE PRECISION 8 Bytes
REAL 8 Bytes
DECIMAL(M,D) M+2 Bytes, wenn D > 0, M+1 Bytes, wenn D = 0 (D+2, wenn M < D)
NUMERIC(M,D) M+2 Bytes, wenn D > 0, M+1 Bytes, wenn D = 0 (D+2, wenn M < D)
Spaltentyp Speicherbedarf
DATE 3 Bytes
DATETIME 8 Bytes
TIMESTAMP 4 Bytes
TIME 3 Bytes
YEAR 1 Byte
Spaltentyp Speicherbedarf
CHAR(M) M Bytes, 1 <= M <= 255
VARCHAR(M) L+1 Bytes, wobei L <= M und1 <= M <= 255
TINYBLOB, TINYTEXT L+1 Bytes,wobei L < 2^8
BLOB, TEXT L+2 Bytes,wobei L < 2^16
MEDIUMBLOB, MEDIUMTEXT L+3 Bytes,wobei L < 2^24
VARCHAR und die BLOB- und TEXT-Typen sind Typen variabler Länge, bei denen der Speicherbedarf
von der tatsächlichen Länge der Spaltenwerte abhängt (in der vorstehenden Tabelle dargestellt
durch L) statt von der maximal möglichen Größe des Typs. VARCHAR(10) zum Beispiel kann
eine Zeichenkette mit einer maximalen Länge von 10 Zeichen enthalten. Der tatsächliche
Speicherbedarf ist die Länge der Zeichenkette (L) plus 1 Byte, um die Länge zu speichern. Bei der
Zeichenkette abcd ist L 4 und der Speicherbedarf 5 Bytes. Die BLOB- und TEXT-Typen benötigen
1, 2, 3 oder 4 Bytes, um die Länge des Spaltenwerts zu speichern, abhängig von der maximal
möglichen Länge des Typs. Siehe Seite 396, Die BLOB- und TEXT-Typen. Wenn eine Tabelle irgend
welche Spaltentypen variabler Länge enthält, ist das Datensatzformat ebenfalls von variabler
Länge. Beachten Sie, dass MySQL bei der Erzeugung einer Tabelle unter bestimmten Umständen
eine Spalte eines Typs variabler Länge in einen Typ fester Länge umwandelt, und umgekehrt.
Siehe Seite 468, Stille Spaltentyp-Änderungen. Die Größe eines ENUM-Objekts hängt von der Anzahl
unterschiedlicher Aufzählungswerte ab. Bei Aufzählungen mit bis zu 255 möglichen Werten wird 1
Byte benutzt, bei Aufzählungen mit bis zu 65535 Werten 2 Bytes. Siehe Seite 397, Der ENUM-Typ.
Die Größe eines SET-Objekts hängt von der Anzahl unterschiedlicher SET-Elemente ab. Wenn die
SET-Größe N ist, belegt das Objekt (N+7)/8 Bytes, gerundet auf 1, 2, 3, 4 oder 8 Bytes. Ein SET
kann maximal 64 Elemente besitzen. Siehe Seite 398, Der SET-Typ.
Spaltentyp Speicherbedarf
LONGBLOB, LONGTEXT L+4 Bytes,wobei L < 2^32
ENUM(wert1,wert2,...) 1 oder 2 Bytes, abhängig vonder Anzahl der Aufzählungswerte (65535
Werte maximal)
SET(wert1,wert2,...) 1, 2, 3, 4 oder 8 Bytes,abhängig von der Anzahl von SET-Elementen (64
Elemente maximal)
</cite>
Bye
Timothy
Halihallo Stefan
wie kann ich den Speicherbedarf einzelner Datensätze in MySQL-Tabellen ermitteln?
phpMyAdmin gibt heute schon ziemlich detailierte Auskünfte über den Platzbedarf.
Ich habe eine gegebene Abfrage, z.B, "SELECT * FROM MeineTabelle WHERE Bedingung;", habe, dann würde ich gerne wissen, wieviel Platz auf der Festplatte der so ausgewählte Datensatz belegt. Wird kein Datensatz gefunden, dann muss natürlich 0 rauskommen, werden mehrere Datensätze gefunden, dann der von insgesamt von diesen Datensätzen belegte Speicherplatz.
Ein Query wird dir das jedoch nicht ausgeben; das musst du wohl selber berechnen. Es gibt
in MySQL einige Möglichkeiten, wie man dies auslesen kann, jedoch nicht für einen und nur
einen Datensatz.
http://www.mysql.com/doc/en/SHOW_TABLE_STATUS.html
Wie kann ich das ermitteln?
Selber berechnen oder in der MySQL-Doku nachlesen.
Neben dem, was timothy gesagt hat, wollte ich noch etwas über Indizies sagen:
Die Indizies verbrauchen auch Speicherplatz; ziemlich viel dazu! - Da jeder Primary Key
auch an einen UNIQUE-Index geknüpft ist, halte ich es für angebracht, dies auch zu
nennen. Jede Datenbank verwendet AVL-Bäume (o. ä.) um die Indexstrukturen aufzubauen.
Es werden jeweils mehrere indizierte Werte einer Spalten zusammengepackt und zwar so,
dass sie sich optimal der Pagegrösse (auf Festplatten kann man nur Packete der Grösse
1024, 2048, ... Bytes lesen; niemals Bytes alleine) anpassen. Wenn du z. B. nur einen
Record in einer Tabelle hast und diesen über einen Primary Key ansprichst, verbraucht
der Index für diese Tabelle wohl ca. 1 KB + die Daten des Records selber + Metadaten
für den Tablehandler, ... Die Berechnung für den Speicherplatzbedarf eines einzigen
Records ist also etwas komplizierter. Was du jedoch wissen solltest ist, dass auch
Indizies Speicherplatz verbrauchen und dass diese auf Performance getrimmt sind und
bei dem Speicherplatz nicht umbedingt sparsam sind.
Viele Grüsse
Philipp