2010-06-01

InfiniDBを使ってみる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
InfiniDBは列指向型DBと言われるもので、データウェアハウスなどの大量データの扱いにすぐれているようです。

特長は、mysqlのストレージエンジンとして実装されていて各種sqlでデータ操作ができるということです。
なのでアプリケーションは作りやすいそうな感じです。

詳しくは、
http://www.infinidb.org/
をご覧ください。

というわけで試してみました。

CentOS5.4(32bit版)へインストールしてみました。
手順は、以下のような感じです。

ルートで行います。
su

boostというものが別途必要な感じです。
yum install boost

ダウンロードしてインストールします。
wget http://infinidb.org/downloads/doc_download/203-105-final-32-bit-rpms
tar xvzf 203-105-final-32-bit-rpms
rpm -ivh calpont*.rpm

すでにmysqlが動いている環境にインストールしたので利用ポートの変更とutf-8の設定を行います。
vi /usr/local/Calpont/mysql/my.cnf
3306としている部分を3366なりに変更します。
また、[mysqld]と[mysql]のセクションに
default-character-set=utf8
を追加します。

なんかスクリプトを流します。
/usr/local/Calpont/bin/install-infinidb.sh

InfiniDB用のmysqlクライアントを用意します。
vi /usr/local/bin/idbmysql
------------------------------
#!/bin/bash
/usr/local/Calpont/mysql/bin/mysql --defaults-file=/usr/local/Calpont/
mysql/my.cnf $*
------------------------------
chmod 755 /usr/local/bin/idbmysql

これで完了です。
起動終了は、
/etc/init.d/infinidb start
/etc/init.d/infinidb stop
になります。

データベースの作成は通常のmysqlと変わりません。
idbmysql -u root
create database ttt;
use ttt;

テーブルもストレージエンジンにInfiniDBと指定することで作成できます。
ただしindexをつけることができませんし、PKを含めNOT NULLなどの制約も利用できません。
indexは実質不要でよいようなのですが、制約がかけられないのはちょっと面倒かもしれません。

とりあえず性能を比較してみました。
同じマシンで通常のmysql(InnoDB)とInfiniDBの両方を動かして
以下のようなテーブルを用意します。
TABLE名(tttt)
id:int InnoDBではPKにします。
code:varchar(16) InnoDBではindexを張ります。
amount:int
val:varchar(255)
このテーブルに40万件ほどデータを入れておきます。

それぞれに対して同じsqlを発行した結果です。
(1)select count(*) from tttt;
 InnoDB:4.78 sec
 InfiniDB:0.73 sec

(2)select sum(amount) from tttt;
 InnoDB:3.06 sec
 InfiniDB:0.38 sec

(3)select code,sum(amount) from tttt group by code;
 InnoDB:6.72 sec
 InfiniDB:1.07 sec

(4)select count(*) from tttt where code='AAAA';
 InnoDB:0.29 sec
 InfiniDB:0.47 sec

(5)select * from tttt where code='AAAA' limit 1;
 InnoDB:0.00 sec
 InfiniDB:6.91 sec

(6)select count(*) from tttt where val='test';
 InnoDB:2.73 sec
 InfiniDB:0.43 sec

(7)select count(*) from tttt where val like '%es%';
 InnoDB:4.08 sec
 InfiniDB:0.48 sec

確かにselectは、速い感じで確かにデータウェアハウスとかに適していそうな感じです。
そのうち使ってみてもよいかもと思ってみたりしてみました。
コメントを投稿