2009-07-29 41 views
1

テーブルのストレスデータを作成しているうちに、以下のファイルが生成されています。MYDファイルのサイズがなぜ大きいのですか?

-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 

実際には、この表に1985968個のレコードが挿入されました。しかし、インデックスのファイルサイズは信じられないほどです。テーブルの

構造MYDのファイルサイズを減らすためにどのような方法があります

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) 
); 

のですか?

答えて

8

.MYIはあなたのインデックスであり、.MYDはあなたのデータです。 .MYDのサイズを縮小する唯一の方法は、行を削除するか、列サイズを変更することです。

200万行のインデックスの50MBは大きくありません。 total_ot 11バイト

  • - - 4バイト
  • EMP_NUMBERから101バイト
  • card_dateをのcompany_id

    • のは、あなたのテーブルのサイズの内訳を見てみましょう - 17バイト

    • total_per - 17バイト
    • leave_taken - 9バイト
    • total_lop - 9バイト
    • time_entry - 平均(長さ(time_entry))+ 3バイト

    これが与えます私たちは172 + time_entryバイトの行の長さです。 time_entryが100バイトで平均した場合。あなたが見ている272 * 2000000 = 544MB

    私にとって重要なのはVARCHARの数です。従業員番号はvarchar(100)である必要がありますか、さらにはvarcharである必要がありますか?列全体を索引付けしているときに、そのデータをインデックス内の(company_id、emp_number、card_date)全体に複製しています。

    ここではvarcharは必要ありません。プライマリキーに含まれている必要はないかもしれません。

    本当にTEXTフィールドにtime_entryが必要ですか?これはおそらく、データベース内のスペースを最大に消費する可能性があります。

    なぜカードの日付にvarchar(10)を使用していますか? DATETIMEを使用した場合、11の代わりに8バイトのみを使用し、TIMESTAMPは4バイトになり、DATEは3バイトになります。

    また、NULLにできるすべての列に1バイトを追加します。

    また、ANALYZE/REPAIR/OPTIMIZE TABLEコマンドを実行してみてください。

  • 3

    多くは、そのtime_entryテキストフィールドの大きさに依存します。私はそれが100バイト未満の小さいものと仮定します。次にレコードあたりおよそ4 + 100 + 10 + 100 + 15 + 15 + 8 + 8 =およそ300バイトのデータがあります。 200万レコードあります。私はデータベースが600メガバイトになると思う。実際には、ディスク上のMYDに8000メガバイトのデータを表示しています。これは12倍です。何かがおかしい。

    最良の診断ツールはshow table statusです。特に、Avg_row_lengthとData_lengthをチェックすると、スペースがどこにあるかについてのいくつかの洞察が得られます。

    MyISAMテーブルを使用している場合は、myisamchkがテーブルを小さくするのに役立つことがあります。このツールは、データベースから多くの行を挿入してから削除した場合に特に役立ちます。 "最適化テーブル"も役立ちます。 MyISAMはmyisampackで読み取り専用の圧縮テーブルをサポートしています。私は最後の手段としてそれを扱っています。

    関連する問題