MySQLのMERGEテーブル

Oracleで言うパーティショニング、SQL Serverで言うパーティション分割のような
機能をMySQLで使いたくて調べてみた。


厳密に同じものは存在しないが、MERGEテーブルがまだ近い。
しかし、

  • MyISAMでしか使えない。
  • レンジ毎に格納する領域を指定できない。

といったところに問題を感じる。


とりあえずパフォーマンスを試してみようと思い、ダミーデータを作った。


CREATE TABLE t1 (
id INT NOT NULL DEFAULT 0,
date DATE NOT NULL,
code INT NOT NULL DEFAULT 0,
quantity DECIMAL(7,2) NOT NULL DEFAULT 0,
price DECIMAL(7,2) NOT NULL DEFAULT 0,
amount DECIMAL(9,0) NOT NULL DEFAULT 0,
PRIMARY KEY(id),
INDEX DATE(date)
) TYPE=MyISAM;

t1〜t5に20万ずつ挿入。

CREATE TABLE total (
id INT NOT NULL DEFAULT 0,
date DATE NOT NULL,
code INT NOT NULL DEFAULT 0,
quantity DECIMAL(7,2) NOT NULL DEFAULT 0,
price DECIMAL(7,2) NOT NULL DEFAULT 0,
amount DECIMAL(9,0) NOT NULL DEFAULT 0,
PRIMARY KEY(id),
INDEX DATE(date)
) TYPE=MERGE UNION=(t1, t2, t3, t4, t5)

よく使うSELECT文を試していたら、


SELECT * FROM total WHERE id < 10000 ORDER BY id DESC LIMIT 1
が遅い。
MySQLのバージョンが4.0.25で平均して1.8602秒くらいかかる。
試しに5.0.10で試したら平均して0.1093秒くらい。
4.1系は試していないけど、バージョンによってかなり違う。