2009-07-29 16 views
1

Während ich Stress Daten für eine Tabelle erstellt habe, habe ich folgende Dateien gefunden.Warum ist die Größe der MYD-Datei so hoch?

-rw-rw---- 1 mysql mysql  8858 Jul 28 06:47 card.frm 
-rw-rw---- 1 mysql mysql 7951695624 Jul 29 20:48 card.MYD 
-rw-rw---- 1 mysql mysql 51360768 Jul 29 20:57 card.MYI 

Eigentlich habe ich 1985968 Anzahl der Datensätze in dieser Tabelle eingefügt. Aber die Größe der Indexdatei ist unglaublich.

Struktur der Tabelle ist

create table card(
    company_id int(10), 
    emp_number varchar(100), 
    card_date varchar(10), 
    time_entry text, 
    total_ot varchar(15), 
    total_per varchar(15), 
    leave_taken double, 
    total_lop double, 
    primary key (company_id,emp_number,card_date), 
    index (company_id,card_date) 
); 

Gibt es eine Möglichkeit, die Dateigröße des MYD zu reduzieren?

Antwort

8

Bitte beachten Sie, dass .MYI ist Ihr Index und .MYD ist Ihre Daten. Die einzige Möglichkeit, die Größe von .MYD zu reduzieren, besteht darin, Zeilen zu löschen oder die Spaltengröße zu ändern.

50 MB für einen Index auf 2 Millionen Zeilen ist nicht groß.

ist bei der Größe Aufschlüsselung Ihrer Tabelle sehen lassen:

  • company_id-4 Bytes
  • emp_number-101 Bytes
  • card_date-11 Bytes
  • total_ot - 17 Bytes
  • total_per - 17 Byte
  • leave_taken - 9 Bytes
  • total_lop - 9 Bytes
  • time_entry - avg (Länge (time_entry)) + 3 Bytes

Man erhält uns eine Zeilenlänge von 172 + time_entry Bytes. Wenn time_entry bei 100 Bytes durchschneidet. Sie betrachten 272 * 2000000 = 544MB

Von Bedeutung ist für mich die Anzahl der VARCHARs. Muss die Mitarbeiternummer ein varchar (100) oder gar ein varchar sein? Sie duplizieren diese Daten vollständig in Ihrem Index auf (company_id, emp_number, card_date), während Sie die gesamte Spalte indexieren.

Wahrscheinlich brauchen Sie hier kein varchar, und Sie brauchen es möglicherweise nicht im Primärschlüssel enthalten.

Benötigen Sie wirklich time_entry, um ein TEXT-Feld zu sein? Dies ist wahrscheinlich der größte Speicherplatzverbraucher in Ihrer Datenbank.

Warum verwenden Sie varchar (10) für das Kartendatum? Wenn Sie DATETIME verwenden würden Sie nur 8 Bytes anstelle von 11 verwenden, TIMESTAMP wäre 4 Bytes und DATE wäre 3 Bytes.

Sie fügen auch 1 Byte für jede Spalte hinzu, die NULL sein kann.

Versuchen Sie auch, die Befehle ANALYSE/REPAIR/OPTIMIZE TABLE auszuführen.

3

Eine Menge hängt davon ab, wie groß das time_entry-Textfeld sein kann.Ich gehe davon aus, dass es klein ist, weniger als 100 Bytes. Dann haben Sie etwa 4 + 100 + 10 + 100 + 15 + 15 + 8 + 8 = etwa 300 Bytes Daten pro Datensatz. Sie haben 2 Millionen Datensätze. Ich würde erwarten, dass die Datenbank 600 Megabyte ist. Tatsächlich zeigen Sie 8000 Megabyte Daten in der MYD auf der Festplatte oder einen Faktor von 12x. Etwas stimmt nicht.

Ihr bestes Diagnosewerkzeug ist show table status. Überprüfen Sie insbesondere Avg_row_length und Data_length, sie geben Ihnen einen Einblick, wo der Speicherplatz ist. Wenn Sie MyISAM-Tabellen verwenden, stellen Sie möglicherweise fest, dass myisamchk die Tabelle verkleinert. Dieses Tool hilft insbesondere, wenn Sie viele Zeilen aus der Datenbank eingefügt und dann gelöscht haben. "Tabelle optimieren" kann auch helfen. MyISAM unterstützt schreibgeschützte komprimierte Tabellen über myisampack. Ich würde das als letzten Ausweg behandeln.

Verwandte Themen