2009年6月30日

[MySQL][Spider]Spiderストレージエンジン 0.12リリース

Spiderストレージエンジンのバージョン 0.12をリリースしました。
http://spiderformysql.com/

Spiderストレージエンジンは、テーブルパーティションとテーブルリンクを組み合わせることで、複数のリモートサーバにあるテーブルを、ローカルサーバにある1つのテーブルとして利用することを可能にするものです。(database sharding)
更新の同期は、Spiderストレージエンジン内部でxaトランザクションを利用して保障します。
資料:
http://www.mysqlconf.com/mysql2009/public/schedule/detail/6837

今回の主な変更は以下です。
(以下に登場する「テーブルパラメータ」とは、テーブル固有のパラメータのことです。詳細は、ダウンロードドキュメント中の「04_table_create.txt」「06_table_parameters.txt」をご確認下さい)
・テーブルパラメータ「table_count_mode」の追加。
  リモートサーバのテーブルが、MyISAMのようなテーブルステータスから正確な全件数を取得できるストレージエンジンを利用している場合のために、テーブルの全件数取得の際にテーブルステータスを利用するオプションを追加しました。

・テーブルパラメータ「select_column_mode」、サーバパラメータ「spider_select_column_mode」の追加。
  select文実行時に取得するカラムの決定方式を、今までのざっくりモードに加え、詳細に割り出すモードを追加し、リモートサーバとの通信量を今までに比べて削減しました。

それ以外の変更については、ダウンロードドキュメント中の「99_change_logs.txt」をご確認下さい。

2009年6月25日

[MySQL][VP]Vertical Partitioningストレージエンジン 0.1リリース

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"'
    );


現在は、αリリースでまだ使えない機能もありますが、なるべく早めにリリースするつもりです。
ご期待下さい。