[InterDB] [著者HP] [PREVIOUS][UP][NEXT]

Copyright @ 2009, Suzuki Hironobu @ InterDB



ここでテーブルdynamic_tableのデータファイル`dynamic_table.MYD'を表示すると、次のようになります(補足 2)。

■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 Table

1列でも可変長のデータ型(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 Characteristics

compressedはmyisampackコマンドによって圧縮された形式です(補足 1)。
データを圧縮するので、そのテーブルは読み出し専用となります(データの挿入,削除,更新ができない)。

データファイルのフラグメンテーションと、OPTIMIZE TABLE文によるデフラグメント

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)

データファイルには(データ削除による)空き領域があるにも関わらず、新たに挿入されたデータはファイルの末尾に追加されています。

このように、データ操作(削除/挿入/更新)を続けることでデータファイルに多数の空き領域ができることを、フラグメンテーションが発生したといいます。
空き領域が多くなるとディスク領域が無駄になるばかりか、ハードディスクアクセスにも悪影響を与えます。


データファイルのフラグメンテーションを解消する処理を`デフラグメント'といい、OPTIMIZE TABLE文で行います。

以下、テーブル dynamic_tableに対してOPTIMIZE TABLE文を実行した結果を示します。

mysql> OPTIMIZE TABLE dynamic_table;
+--------------------+----------+----------+----------+
| Table              | Op       | Msg_type | Msg_text |
+--------------------+----------+----------+----------+
| test.dynamic_table | optimize | status   | OK       |
+--------------------+----------+----------+----------+
1 row in set (0.01 sec)

データファイル`dynamic_table.MYD'は次のようになり、フラグメンテーションが解消されていることがわかります。



補足

(1)
圧縮されたテーブルを元に戻すには、myisamchkコマンドを使います。

(2)
実際のMyISAM型のデータ管理は複雑で、空き領域を正確に図示できるわけではありません。ここでは雰囲気を掴んで頂くことを主眼に色分けしました(もちろん、データファイルの中身は本物です)。



[PREVIOUS][UP][NEXT]