Vertical Partitioningストレージエンジンというストレージエンジンをリリースしました。
http://launchpad.net/vpformysql
このストレージエンジンは、1対1の関係にある複数のテーブルを同一のテーブルのように扱うことを可能にするものです。
これは、1対1の関係にある複数のテーブルをjoinしたviewに似ていますが、MySQLのviewとは以下の点が異なります。
・insertできる。
・パーティションの刈り込みが起こる。(関係のないパーティションは利用しない)
Vertical Partitioningストレージエンジンは以下のような用途で利用できます。
(Vertical Partitioningテーブルを親テーブル、統合されるテーブルを子テーブルと呼びます)
1.レコードサイズの大きいInnoDBテーブルのテーブルスキャンは、レコードが増えるに従ってパフォーマンスが非常に悪くなります。
Vertical Partitioningストレージエンジンを利用することで、このテーブルのレコードサイズを小さく分割し、パフォーマンスを改善することができます。
「select col_d from tbl_a」のような検索の性能を改善する場合。
分割前
create table tbl_a(
col_a int primary key,
col_b int,
col_c int,
col_d int,
col_e varchar(255),
col_f varchar(255),
col_g varchar(255),
col_h varchar(255),
col_i varchar(255),
col_j text,
key idx_a(col_b, col_c),
key idx_b(col_c, col_j(100))
)engine=InnoDB;
分割後
create table tbl_b(
col_a int primary key,
col_b int,
col_c int,
col_d int,
key idx_a(col_b, col_c)
)engine=InnoDB;
create table tbl_c(
col_a int primary key,
col_c int,
col_e varchar(255),
col_f varchar(255),
col_g varchar(255),
col_h varchar(255),
col_i varchar(255),
col_j text,
key idx_b(col_c, col_j(100))
)engine=InnoDB;
create table tbl_a(
col_a int primary key,
col_b int,
col_c int,
col_d int,
col_e varchar(255),
col_f varchar(255),
col_g varchar(255),
col_h varchar(255),
col_i varchar(255),
col_j text,
key idx_a(col_b, col_c),
key idx_b(col_c, col_j(100))
)engine=VP
comment 'table_name_list "tbl_b tbl_c"';
※Vertical Partitioningストレージエンジンでは、複数の子テーブルに同じカラムを持つことを許容しています。これにより、分割の設計が柔軟に行えるようにしています。ただし、あまりカラムを重複させると更新のパフォーマンスが悪くなるので注意してください。
2.MySQL Cluster (ndb)はテキストのカラムを扱うことが得意ではありません。
Vertical Partitioningストレージエンジンは子テーブルを異なるストレージエンジンのテーブルで構成できるため、MySQL Clusterに得意とするカラムだけを担当させることができます。
ストレージエンジン混在例
create table tbl_b(
col_a int primary key,
col_b int,
col_c int,
key idx_a(col_b, col_c)
)engine=ndb ......;
create table tbl_c(
col_a int primary key,
col_c int,
col_d varchar(255),
col_e text,
key idx_b(col_c, col_e(100))
)engine=Spider ......;
create table tbl_a(
col_a int primary key,
col_b int,
col_c int,
col_d varchar(255),
col_e text,
key idx_a(col_b, col_c),
key idx_b(col_c, col_e(100))
)engine=VP
comment 'table_name_list "tbl_b tbl_c"';
3.MySQLはmulti shaped partitioningをまだサポートしていませんが、
Vertical Partitioningストレージエンジンを利用することでそれが利用できるようになります。
1つのテーブルを異なる条件で分割することを、ここではmulti shaped partitioningと呼んでいます。
この機能を使うと詳細用のテーブルとインデックス用のテーブルを分けたものを1つのテーブルとして扱うことができ、さらにそれぞれのテーブルをSpiderストレージエンジンを使ってshardingすることができます。
分割前
create table employees (
id int primary key,
fname varchar(30),
lname varchar(30),
hired date not null default '1970-01-01',
separated date not null default '9999-12-31',
job_code int,
store_id int
)engine=InnoDB;
分割後
create table emp_pk (
id int not null,
separated date not null default '9999-12-31',
unique idx_a(id),
key idx_b(id, separated)
)engine=InnoDB
partition by hash(id)
partitions 4;
create table emp_detail (
id int not null,
fname varchar(30),
lname varchar(30),
hired date not null default '1970-01-01',
separated date not null default '9999-12-31',
job_code int,
store_id int,
key idx_a(id, separated)
)engine=InnoDB
partition by range ( year(separated) ) (
partition p0 values less than (1991),
partition p1 values less than (1996),
partition p2 values less than (2001),
partition p3 values less than maxvalue
);
create table employees (
id int not null,
fname varchar(30),
lname varchar(30),
hired date not null default '1970-01-01',
separated date not null default '9999-12-31',
job_code int,
store_id int,
primary key(id, separated)
)engine=VP
comment 'table_name_list "emp_pk emp_detail", pk_correspond_mode "1"';
※ここでは、どちらの子テーブルにアクセスしてもパーティションの刈り込みが利用できるよう、親テーブルのPKに両方のパーティションの条件に利用するカラムを定義しています。(今後はPKにidのみを指定しても刈り込みが利用できるよう改善を計画中)
4.Vertical Partitioningストレージエンジンは、Spiderストレージエンジンのようなパラレル検索に対応したストレージエンジンに、Vertical Partition単位のパラレル検索能力を与えます。(現在未実装)
5.Vertical Partitioningストレージエンジンは、MySQLのパーティションをサポートしているので、パーティションのラッパーとして利用できます。
これにより、各パーティションをテーブルとして個別に利用する事ができます。(現在未実装なのでこの機能はまだ使用しないで下さい)
利用例
create table tbl_b(
col_a int not null,
col_b varchar(20),
col_c int not null,
primary key(col_a)
)engine=InnoDB;
create table tbl_c(
col_a int not null,
col_b varchar(20),
col_c int not null,
primary key(col_a)
)engine=InnoDB;
create table tbl_d(
col_a int not null,
col_b varchar(20),
col_c int not null,
primary key(col_a)
)engine=InnoDB;
create table tbl_a(
col_a int not null,
col_b varchar(20),
col_c int not null,
primary key(col_a)
)engine=VP
partition by hash(col_a)
(
partition pt1 comment='table_name_list "tbl_b"',
partition pt2 comment='table_name_list "tbl_c"',
partition pt3 comment='table_name_list "tbl_d"'
);
現在は、αリリースでまだ使えない機能もありますが、なるべく早めにリリースするつもりです。
ご期待下さい。
0 件のコメント:
コメントを投稿