今回は、VPの紹介をします。
VPとはVertical Partitioning(垂直パーティショニング)の略で、Spiderと同じく斯波建徳さんの作ったMySQLのストレージエンジンになります。
これは、Spiderの姉妹品のようなもので、1つのテーブルを複数のテーブルにカラム分割します。

イメージとしては、以下のようなものになります。

VIEWに似ていますが、

  • INSERTできる
  • 複数の分割先のテーブル(子テーブル)でカラムの重複が可能

などの点で、VIEWと異なり、これだけの違いでさまざまなことが可能になります。

VPもSpiderと同じくCommentを利用して設定します。
インストール方法は、EC2でMySQL(Spider編1 Spiderってなんじゃ?)で紹介したSpiderのバイナリにVPも含まれているので、そちらを参照してください。

では、まずは試してみます。
たとえば以下のようなテーブルがあるとします。

create table gift(
  id int auto_increment,
  shop_id int,
  country_id int,
  gift_type int,
  gift_name varchar(255),
  description text,
  created_at datetime,
  primary key(id),
  key shop_idx(shop_id),
  key country_idx(country_id)
)engine=InnoDB;

このテーブルは、以下のように分割できます。

create table gift_key(
  id int auto_increment,
  shop_id int,
  country_id int,
  gift_type int,
  gift_name varchar(255),
  primary key(id),
  key shop_idx(shop_id),
  key country_idx(country_id)
)engine=InnoDB;

create table gift_detail(
  id int,
  gift_type int,
  gift_name varchar(255),
  description text,
  created_at datetime,
  primary key(id)
)engine=InnoDB;

create table gift(
  id int auto_increment,
  shop_id int,
  country_id int,
  gift_type int,
  gift_name varchar(255),
  description text,
  created_at datetime,
  primary key(id),
  key shop_idx(shop_id),
  key country_idx(country_id)
)engine=VP
comment 'table_name_list "gift_key gift_detail"';

ここで、VP化したgiftテーブルにデータを投入してみます。

mysql> INSERT INTO gift (shop_id, country_id, gift_type, gift_name, description, created_at)
    -> VALUES (1, 103, 1, 'ハム', 'ハムの人になれます。', CURRENT_TIMESTAMP);
Query OK, 1 row affected (0.03 sec)

問題なくINSERTすることができました。
また、それぞれの子テーブルに重複したカラムにも値が投入され、
かつgiftテーブルから1つのテーブルのようにSELECTできることがわかります。

mysql> select * from gift_key;
+----+---------+------------+-----------+-----------+
| id | shop_id | country_id | gift_type | gift_name |
+----+---------+------------+-----------+-----------+
|  1 |       1 |        103 |         1 | ハム    |
+----+---------+------------+-----------+-----------+
1 row in set (0.00 sec)

mysql> select * from gift_detail;
+----+-----------+-----------+--------------------------------+---------------------+
| id | gift_type | gift_name | description                    | created_at          |
+----+-----------+-----------+--------------------------------+---------------------+
|  1 |         1 | ハム    | ハムの人になれます。 | 2011-09-12 22:10:16 |
+----+-----------+-----------+--------------------------------+---------------------+
1 row in set (0.00 sec)

mysql> select * from gift;
+----+---------+------------+-----------+-----------+--------------------------------+---------------------+
| id | shop_id | country_id | gift_type | gift_name | description                    | created_at          |
+----+---------+------------+-----------+-----------+--------------------------------+---------------------+
|  1 |       1 |        103 |         1 | ハム    | ハムの人になれます。 | 2011-09-12 22:10:16 |
+----+---------+------------+-----------+-----------+--------------------------------+---------------------+
1 row in set (0.00 sec)

今後いくつかVPの活用の仕方を紹介できればと思います。

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら