2014/03/13

mysql MyISAMとInnodb

MyISAMーー>検索は早い、更新などは遅い
Innodbーー>その逆?
===>結構まえの説であり、Innodbもだいぶ進化して、定説はないみたい。。

・MyISAMのテーブルファイル
テーブル名.frmファイル
    どのようなカラム構成にてできているかなどのテーブル構造のデータが格納されます。
テーブル名.MYDファイル
    テーブルのレコードデータが格納されます。
テーブル名.MYIファイル:
    そのテーブルに対して作成された複数のインデックスデータとテーブルの統計情報が格納されます。

★★★MyISAMテーブルの特長
   MyISAMテーブルには固定長構造、可変長構造、圧縮テーブルの3種類のデータ構造があります。前者の2つはレコードデータのサイズの取り扱い方法で、MySQLが自動で選択します。  
    なお、データ構造は「show table status」コマンドで確認できます。次の例では「TEST00」テーブルが固定長レコードの構造(Row_format: Fixed)でできていることがわかります。
mysql> show table status \G;
******** 1. row ***************************
           Name: TEST00
         Engine: MyISAM
        Version: 10
     Row_format: Fixed
           Rows: 0
 Avg_row_length: 0
    Data_length: 0
Max_data_length: 41658296553177087
   Index_length: 1024
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2006-07-12 15:09:18
    Update_time: 2006-07-12 15:09:18
     Check_time: NULL
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options:
        Comment:

・固定長構造

   固定長構造は、テーブルを構成するカラムのデータ型にVARCHAR、TEXT、BLOBを含んでいない場合に選択されます。固定長構造の最大の利点は、レコードの削除が行われた時に削除されたデータ領域の再利用が容易なことです。
   よって、固定長構造のテーブルファイルは再利用できないデータ領域が残ってしまう「データのフラグメンテーション」が発生しない特長を持っています。
   データのフラグメンテーションとは、利用できない無駄なデータ領域が虫食いのように残ってしまうことをいいます。また固定長構造のテーブルには、レコードデータに「row number」と呼ぶレコードを一意に識別する値が付けられ、MySQLはこの値を利用して高速に該当レコードを探し当てる仕組みを持っています。


・可変長構造
   もう一方の可変長構造は、テーブルを構成するカラムのデータ型にVARCHAR、TEXT、BLOBを含んでいる場合に選択されます。可変長構造のテーブルファイルは固定長構造と異なり、レコードを削除した場合のデータ領域の再利用が難しいため、データのフラグメンテーションが発生する可能性を持っています。
   データのフラグメンテーションが発生するとディスクの利用効率が低下するため、検索性能が劣化してしまいます。そのため可変長構造のテーブルの場合は、一定周期でこのデータのフラグメンテーションを取り除く処理を実施する必要があります。


・圧縮テーブル
   3つ目の構造は、圧縮テーブルと呼ぶ読み取り専用のものです。この構造は自動で選択されるものではなく、オプションユーティリティ(myisampack)を用いてユーザが作成するものです。固定長構造/可変長構造ともに、圧縮テーブル構造に変更することが可能です。