Stefan: Mysql: Speicherbedarf einzelner Datensätze

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

  1. 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

  2. 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