■2-07■ MyISAM型MyISAM型のデータ保管形式MyISAM型には3種類の異なるデータ保管形式があります。そのうち2種類(static, dynamic)は、使っている列のデータ型によって自動的に選ばれます。残る1種類(compressed)は、myisampackコマンドによって圧縮された形式です。 Static (Fixed-length) Table全ての列が固定長データのテーブル、言い換えると可変長のデータ型(text,varchar,BLOB)を*使っていない*テーブルは、Static形式が使われます。この形式は全ての列のデータ長が固定されているので、目的のデータにアクセスするための計算が簡単にでき、ディスク上のデータに高速にアクセスできます。つまり検索に最も適している形式ということです。 例として、テーブルstatic_tableを示します。
mysql> SHOW CREATE TABLE static_table\G
*************************** 1. row ***************************
Table: static_table
Create Table: CREATE TABLE `static_table` (
`id` int(11) default NULL,
`data` char(20) default NULL
) TYPE=MyISAM DEFAULT CHARSET=ujis
1 row in set (0.00 sec)
mysql> SELECT * FROM static_table;
+------+--------+
| id | data |
+------+--------+
| 1 | abcdef |
| 2 | abcd |
+------+--------+
2 rows in set (0.00 sec)
テーブルstatic_tableのデータファイル`static_table.MYD'の中身を表示します。列dataの型`char(20)'に応じて、固定長のデータ領域が確保されていることがわかります。 Dynamic Table1列でも可変長のデータ型(text, varchar, BLOB)を使ったテーブルには、Dynamic形式が使われます。この形式では、はじめに何バイト使われているかが書き込まれ、次に実際のデータが書き込まれます。 例として、テーブルdynamic_tableを示します。
mysql> SHOW CREATE TABLE dynamic_table\G
*************************** 1. row ***************************
Table: dynamic_table
Create Table: CREATE TABLE `dynamic_table` (
`id` int(11) default NULL,
`data` varchar(20) default NULL
) TYPE=MyISAM DEFAULT CHARSET=ujis
1 row in set (0.00 sec)
mysql> SELECT * FROM dynamic_table; +------+--------+ | id | data | +------+--------+ | 1 | abcdef | | 2 | abcd | +------+--------+ 2 rows in set (0.00 sec) 次に、テーブルdynamic_tableのデータファイル`dynamic_table.MYD'の中身を表示します。
Compressed Table Characteristicscompressedはmyisampackコマンドによって圧縮された形式です(補足 1)。データを圧縮するので、そのテーブルは読み出し専用となります(データの挿入,削除,更新ができない)。
Dynamic形式のデータファイルに対してデータの削除や更新を繰り返すと、データファイルに`フラグメンテーション'が発生します。 具体的な例で説明しましょう。 前出のテーブルdynamic_tableに対し、DELETE文とINSERT文を実行します。 mysql> DELETE FROM dynamic_table WHERE id = 1; Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO dynamic_table VALUES(3, 'abcdefghijk'), (4, 'abc'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM dynamic_table; +------+-------------+ | id | data | +------+-------------+ | 3 | abcdefghijk | | 2 | abcd | | 4 | abc | +------+-------------+ 3 rows in set (0.00 sec) |
|
mysql> OPTIMIZE TABLE dynamic_table; +--------------------+----------+----------+----------+ | Table | Op | Msg_type | Msg_text | +--------------------+----------+----------+----------+ | test.dynamic_table | optimize | status | OK | +--------------------+----------+----------+----------+ 1 row in set (0.01 sec)
|