Open Source WEB

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) となるのである。エンジンはモーターになっちゃうんだ。

つい、こんなことに感心してしまう。


戻る:InnoDBでテーブル毎にデータファイルを作る方法

次へ:テーブルがBDBの場合はどうなるか


フィードバック:

Name:
Comment:
Benetta: (Sat Feb 18 10:50:19 2012 )
I told my kids we'd play after I found what I neeedd. Damnit.

このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us