Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
HEAP の テーブル
MySQLで使用できるテーブルの型(データベースエンジンの型)はたくさんあり、 非常によく使われるMyISAMとInnoDBについて調べた。 今回は、HEAP型について調べる。 HEAP型は、メモリ上にテーブルを確保し、ファイルにデータを格納しない。
メモリ上に存在するので、他の型に比較して高速と思うが、 日本語の旅では、そのあたりは調べない。
HEAP型のテーブルを作るのは、極めて簡単である。 CREATE TABLEにおいて、 ENGINE=HEAP という指定をするだけである。
ENGINE=HEAP
それでは、さっそくHEAP型のテーブルを作ってみよう。 一旦データベース「日本」の中のテーブルを全部削除してから、 「漢字」という名前のテーブルを、InnoDBのときと同じように作ってみよう。
mysql> CREATE TABLE `漢字` ( `字` char(1), `画数` int )
-> ENGINE=HEAP DEFAULT CHARACTER SET eucjpms;
Query OK, 0 rows affected (0.11 sec)
mysql> INSERT INTO `漢字` VALUES ('鰯',21),('鯰',19),('鰹',23);
Query OK, 3 rows affected (0.08 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM `漢字`;
+------+--------+
| 字 | 画数 |
+------+--------+
| 鰯 | 21 |
| 鯰 | 19 |
| 鰹 | 23 |
+------+--------+
3 rows in set (0.09 sec)
mysql> SHOW CREATE TABLE `漢字`\G
*************************** 1. row ***************************
Table: 漢字
Create Table: CREATE TABLE `漢字` (
`字` char(1) default NULL,
`画数` int(11) default NULL
) ENGINE=MEMORY DEFAULT CHARSET=eucjpms
1 row in set (0.03 sec)
mysql>
ENGINE=HEAP と指定したにもかかわらず、 ENGINE=MEMORY と 表示されてしまった。HEAPと指定しても、MEMORYと指定しても、 MEMORYとして扱われるようである。
ENGINE=HEAP
ENGINE=MEMORY
さて、ここで例によって、shellで、 ディレクトリ内がどうなっているか調べてみよう。
shell# ls /usr/local/mysql/var/日本 db.opt 漢字.frm shell#
できたのは、漢字.frm だけである。 データファイルは無いので、どこにも見つからない。
HEAPテーブルの中味は消える
HEAPは、フォーマットはファイルに保存されるが、 データはメモリ上にしかなく、サーバを停止するとなくなる、となっているので、 さっそく再起動して確かめてみよう。
ここでは、以下のようにして再起動した。
shell# /usr/local/mysql/bin/mysqladmin -u root shutdown STOPPING server from pid file /usr/local/mysql/var/charlie.underground.timedia.co.jp.pid shell# 051022 14:44:33 mysqld ended shell# /usr/local/mysql/bin/mysqld_safe --user=mysql & [1] 8368 shell# Starting mysqld daemon with databases from /usr/local/mysql/var
では、mysqlクライアントから、どうなっているか調べてみよう。
mysql> USE `日本`;
Database changed
mysql> SHOW TABLES;
+------------------+
| Tables_in_日本 |
+------------------+
| 漢字 |
+------------------+
1 row in set (0.04 sec)
mysql> SHOW CREATE TABLE `漢字`\G
*************************** 1. row ***************************
Table: 漢字
Create Table: CREATE TABLE `漢字` (
`字` char(1) default NULL,
`画数` int(11) default NULL
) ENGINE=MEMORY DEFAULT CHARSET=eucjpms
1 row in set (0.00 sec)
mysql>
ちゃんと、テーブルのフォーマットは再起動する前の状態になっている。
しかし、中味を見ようとすると、
mysql> SELECT * FROM `漢字`; Empty set (0.00 sec) mysql>
となって、中味は失われてしまう。 まあ、メモリ上にデータを確保しているだけなのだから、当然だろう。
注意点
HEAP型は、メモリ上にテーブルが確保されるので、 これをどんどん大きくしてしまうと、様々な問題が起きる筈である。 また、データがファイルに反映されることがない一時的なテーブルであるので、 それほど機能は頑張っていない型なので、 どのくらい手抜きかも知っておく必要がある。 ファイルにデータが保存されないという、要するに一時的なタイプなので、 適度に手抜きすることは、非常にバランスが取れていると言えよう。
しかし、その詳細をここに書くときりがないので、オンラインマニュアルの
14.3. The MEMORY (HEAP) Storage Engine
を参照されたい。なお、この説明は現在、英語とフランス語しかないようである。 フランス語になると、タイトルが Le moteur de table MEMORY (HEAP) となるのである。エンジンはモーターになっちゃうんだ。
つい、こんなことに感心してしまう。
フィードバック: