無料Wikiサービス | デモページ
Linuxなどのメモ書き

MySQL テーブルサイズの上限


MySQLのMyISAMテーブルではオプションを指定せずにテーブルを作成するとサイズの上限は4GBとなる(*1)。テーブルサイズの設定に関するメモ。

(*1) 対象Ver.は4.0〜。ファイルシステムのファイルサイズ上限により4GBまで使えない場合もある。

テーブルサイズの上限の表示

テーブルサイズの上限は'SHOW TABLE STATUS'で表示できる。Max_data_lengthのカラムがテーブルサイズの上限値。データベース、テーブル名を指定して表示したい場合は、SHOW TABLE STATUS FROM DB名 LIKE 'テーブル名'で表示できる。
mysql> SHOW TABLE STATUS FROM test LIKE 'sample' \G
*************************** 1. row ***************************
           Name: sample
         Engine: MyISAM
        Version: 9
     Row_format: Dynamic
           Rows: 0
 Avg_row_length: 0
    Data_length: 0
Max_data_length: 4294967295
   Index_length: 1024
      Data_free: 0
 Auto_increment: 1
    Create_time: 2006-10-03 15:08:20
    Update_time: 2006-10-03 15:08:20
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.01 sec)


上限を指定してテーブルを作る

テーブル作成時にサイズを指定する場合は、MAX_ROWS,AVG_ROW_LENGTHオプションを指定する。MAX_ROWSは最大レコード数でAVG_ROW_LENGTHはレコード長の平均値となる。MAX_ROWS * AVG_ROW_LENGTHの計算によってテーブルサイズが計算されるので、この積が必要サイズになるように指定すればよい。ただし、MySQLの最適化のためか(?)実際のテーブルサイズはMAX_ROWS * AVG_ROW_LENGTHよりはずっと大きい値となる。

以下は20GB(MAX_ROWS=500000*AVG_ROW_LENGTH=40000)の上限値でテーブルを作成する例。作成されたテーブルのMax_data_lengthは1TB近くになっている。

mysql> CREATE TABLE tst_tbl (id SERIAL, content TEXT)
       MAX_ROWS=500000,AVG_ROW_LENGTH=40000;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW TABLE STATUS LIKE 'tst_tbl' \G
*************************** 1. row ***************************
           Name: tst_tbl
         Engine: MyISAM
        Version: 9
     Row_format: Dynamic
           Rows: 0
 Avg_row_length: 0
    Data_length: 0
Max_data_length: 1099511627775
   Index_length: 1024
      Data_free: 0
 Auto_increment: 1
    Create_time: 2006-10-03 15:38:57
    Update_time: 2006-10-03 15:38:57
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: max_rows=500000 avg_row_length=40000
        Comment:
1 row in set (0.01 sec)

なお、テーブルにTEXTやBLOBなど可変長のものがなければ、AVG_ROW_LENGTHは指定する必要はない。MAX_ROWSだけでテーブルサイズを算出してくれる。


既存のテーブルのサイズ上限を変更する

既存のテーブルのサイズ上限を変更する場合は、ALTER TABLE テーブル名 MAX_ROWS=<最大レコード数>, AVG_ROW_LENGTH=<レコードの平均長>で設定できる。CREATE TABLEと同じくテーブルサイズの上限はMAX_ROWS*AVG_ROW_LENGTHによって計算される。

以下は20GB(MAX_ROWS=500000*AVG_ROW_LENGTH=40000)に設定する例。既にテーブルサイズが大きくなっている場合は、実行に時間がかかる。

mysql> SHOW TABLE STATUS FROM Contents LIKE 'tst_tbl' \G
*************************** 1. row ***************************
           Name: tst_tbl
         Engine: MyISAM
        Version: 9
     Row_format: Dynamic
           Rows: 188558
 Avg_row_length: 22777
    Data_length: 4294967264
Max_data_length: 4294967295
   Index_length: 4639744
      Data_free: 0
 Auto_increment: 188559
    Create_time: 2006-09-29 20:41:41
    Update_time: 2006-10-03 12:30:46
     Check_time: 2006-09-29 20:44:44
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)

mysql> ALTER TABLE tst_tbl MAX_ROWS=500000, AVG_ROW_LENGTH=40000;
Query OK, 188435 rows affected (4 min 21.11 sec)
Records: 188435  Duplicates: 0  Warnings: 0

mysql> SHOW TABLE STATUS FROM Contents LIKE 'tst_tbl' \G
*************************** 1. row ***************************
           Name: tst_tbl
         Engine: MyISAM
        Version: 9
     Row_format: Dynamic
           Rows: 188435
 Avg_row_length: 22776
    Data_length: 4291895168
Max_data_length: 1099511627775
   Index_length: 5040128
      Data_free: 0
 Auto_increment: 188559
    Create_time: 2006-10-03 14:43:31
    Update_time: 2006-10-03 14:46:40
     Check_time: 2006-10-03 14:47:46
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: max_rows=500000 avg_row_length=40000
        Comment:
1 row in set (0.01 sec)



最終更新 2006/10/03 15:49:10 - kztomita
(2006/10/03 15:08:04 作成)