ちょっと硬派なコンピュータフリークのBlogです。

カスタム検索

2012-06-07

MySQL Clusterに外部キーがやってくる!!

タイトルのまんまなのだが、現在最新のラボ版(アルファ相当)であるMySQL Cluster 7.3で外部キーが追加された。外部キーのサポートがないのはRDBMSにとって割と致命的ではないかと思っていたのだが、これでようやくMySQL Clusterがその汚名を返上できることになる。

ダウンロード&インストール

MySQL Cluster 7.3(ラボ版)はlabs.mysql.comからダウンロードできる。インストール方法は特にこれまでのバージョンのMySQL Clusterと変わらない。MySQL Clusterの使い方を知っている人はぜひ気軽に試して頂きたい。

外部キーの使い方はInnoDB(つまり通常のMySQL)とほとんど同じだ。詳しくは下記のエントリーを参照して頂きたい。

Foreign Keys in MySQL Cluster @ Andrew Morgan’s MySQL Cluster Database Blog

以下にごくごく簡単な例を示そう。最後の2つのステートメントは外部キー制約によりエラーになっている。

mysql> create table t1 (a int unsigned not null primary key) engine ndb;
Query OK, 0 rows affected (0.15 sec)

mysql> create table t2 (a int unsigned not null primary key, b int unsigned not null, index (b), constraint fk_b foreign key (b) references t1(a) on delete restrict on update restrict) engine ndb;
Query OK, 0 rows affected (0.21 sec)

mysql> insert into t2 values(1,1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 values(2,2);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (Unknown error code)

mysql> delete from t1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (Unknown error code)

実装について

MySQL Cluster 7.3では、外部キーはデータノード上でチェックするようになっている。そのため、NDBストレージエンジン(=MySQL Cluster)以外のテーブル上のキーを外部キーで参照することはできない。InnoDBもそれは同様である。つまり、InnoDBとNDBのテーブルをまたがった外部キーは定義できない。

データノードでは、外部キーをチェックする際にSharedGlobalMemoryを消費する。SharedGlobalMemoryはデフォルトでも構わないが、0にはしないよう注意しよう。SharedGlobalMemoryがないと外部キー制約を定義することができない。(話はそれるが最近はSharedGlobalMemoryの使い道が増えてきた。AQL=Pushdown JOINやトランスポーター用のメモリでも利用されるようになった。)

まとめ

MySQL Clusterにおいて外部キーが利用できるようになった意味は大きい。これまでは外部キーが本来するべき制約のチェックを、アプリケーション側でおこなう必要があった。これはパフォーマンス的にもよくないし、開発やメンテナンスの対象となるソースコード(SQL)が増える要因であった。外部キーがあれば性能も向上するし、開発の手間も減る。

これまで外部キーがないことでMySQL Clusterを敬遠していた皆さん!!今こそお試しを!!(ただしまだラボ版なので本番環境では使わないように。あと、将来のバージョンで予期なく仕様が変更される場合もあるので悪しからずご了承頂きたい。)

0 コメント:

コメントを投稿