MAX_ROWSでMYISAMテーブルの最大サイズを変更

現在のテーブルの最大サイズを調査


mysql> SHOW TABLE STATUS LIKE 'TABLE100'\G
*************************** 1. row ***************************
Name: TABLE100
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: 7
Avg_row_length: 60
Data_length: 420
Max_data_length: 281474976710655
Index_length: 3072
Data_free: 0
Auto_increment: 8
Create_time: 2009-04-13 16:03:30
Update_time: 2009-04-13 16:07:52
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)

mysql> select table_name,max_data_length from
-> INFORMATION_SCHEMA.TABLES where
-> TABLE_SCHEMA = 'DB01' AND TABLE_NAME = 'TABLE100';
+------------+-----------------+
| table_name | max_data_length |
+------------+-----------------+
| TABLE100 | 281474976710655 |
+------------+-----------------+
1 row in set (0.00 sec)

mysql>

mysql> select @@global.myisam_data_pointer_size;
+-----------------------------------+
| @@global.myisam_data_pointer_size |
+-----------------------------------+
| 6 |
+-----------------------------------+
1 row in set (0.00 sec)

mysql>

max_data_length

max_data_lenght

@@global.myisam_data_pointer_size

max_data_lenght_2

MAX_ROWS

テーブル内に格納する予定の最大行数。これは、厳しい制限というよりは、ストレージ エンジンに対して、テーブルが少なくてもこの程度の行数を格納できる必要があるという事を表すヒントのような物です。

AVG_ROW_LENGTH

テーブルの平均行長近似値です。可変サイズ行を持つ大きいテーブルに対してのみ、これを設定する必要があります。
MyISAM テーブルを作成する時、MySQL はテーブルが最終的にどの程度の大きさになるのかを決める為に MAX_ROWS と AVG_ROW_LENGTH オプションの製品を利用します。もしどちらのオプションも指定しなければ、テーブルの最大サイズはデフォルトで256 TB になります。(もし使用している OS がその大きさのファイルをサポートしていなければ、テーブル サイズはファイル サイズ制限に制約されます。)もし大きいファイルが必要無く、インデックスを小さく早くする為にポインタサイズを小さくしたければ、myisam_data_pointer_size システム変数を設定する事でデフォルトのポインタ サイズを小さくする事ができます。

※ MYSQL5.0.6~ は4GBから256TBになっている。
You are using a MyISAM table and the space required for the table exceeds
what is allowed by the internal pointer size. MyISAM creates data and index
table files to allow up to 4GB by default (256TB as of MySQL 5.0.6),
but this limit can be changed up to the maximum allowable
size of 65,536TB (2567 – 1 bytes).

To change the default size limit for MyISAM tables, set the myisam_data_pointer_size,
which sets the number of bytes used for internal row pointers.
The value is used to set the pointer size for new tables if you do not specify the
MAX_ROWS option. The value of myisam_data_pointer_size
can be from 2 to 7. A value of 4 allows tables up to 4GB; a value of 6 allows tables up to 256TB.

参考URL

別の最大サイズを指定して、テーブルを作成してみる。


CREATE TABLE TABLE101 (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
title varchar(100) NOT NULL,
body varchar(45) NOT NULL,
PRIMARY KEY (id),
FULLTEXT KEY title (title,body)
) MAX_ROWS=4294967295,AVG_ROW_LENGTH=60 ENGINE=MyISAM DEFAULT CHARSET=utf8;

mysql> select table_name,max_data_length from
-> INFORMATION_SCHEMA.TABLES where
-> TABLE_SCHEMA = 'DB01' AND TABLE_NAME = 'TABLE101';
+------------+-----------------+
| table_name | max_data_length |
+------------+-----------------+
| TABLE101 | 1099511627775 |
+------------+-----------------+
1 row in set (0.00 sec)

mysql> SHOW TABLE STATUS LIKE 'TABLE101'\G
*************************** 1. row ***************************
Name: TABLE101
Engine: MyISAM
Version: 10
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: 2009-04-15 11:49:44
Update_time: 2009-04-15 11:49:44
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options: max_rows=4294967295 avg_row_length=60
Comment:
1 row in set (0.00 sec)

mysql>

size

おそらくほとんど必要ないが、今後MAX_ROWSを指定せずにより大きいサイズのテーブルを扱いたい場合は以下のようにDefault設定を変更しておく。

mysql> select @@global.myisam_data_pointer_size;
+-----------------------------------+
| @@global.myisam_data_pointer_size |
+-----------------------------------+
| 6 |
+-----------------------------------+
1 row in set (0.00 sec)

mysql>

mysql> set @@global.myisam_data_pointer_size = 7;
Query OK, 0 rows affected (0.00 sec)

mysql> select table_name,max_data_length from INFORMATION_SCHEMA.TABLES where TABLE_SCH EMA = 'DB01' AND TABLE_NAME = 'TABLE100';
+------------+-----------------+
| table_name | max_data_length |
+------------+-----------------+
| TABLE100 | 281474976710655 |
+------------+-----------------+
1 row in set (0.00 sec)

mysql> alter table TABLE100 engine = MyISAM; Query OK, 7 rows affected (0.15 sec)
Records: 7 Duplicates: 0 Warnings: 0

mysql> select table_name,max_data_length from INFORMATION_SCHEMA.TABLES where TABLE_SCH EMA = 'DB01' AND TABLE_NAME = 'TABLE100';
+------------+-------------------+
| table_name | max_data_length |
+------------+-------------------+
| TABLE100 | 72057594037927935 |
+------------+-------------------+
1 row in set (0.00 sec)

mysql>

change

Comments are closed.

Post Navigation