2011年 6月 18日 はてなブックマーク -
タグ: #MySQL

COLUMNS PARTITIONING

大規模なデータを扱うときに便利なパーティショニングにも嬉しい改良が加えられている。従来 のRANGEパーティショニングでは評価式が必ずINT型の結果を返すようにする必要があった。具体的に言うと、日付型のカラムを用いる場合には次のよう にTO_DAYS()関数を用いるなどという対処が必要であった。

1
2
3
4
5
6
7
8
9
10
11
12
13
create table t1 (
  id int unsigned not null auto_increment,
  mydate date not null,
  primary key(id,mydate)
) partition by range (to_days(mydate)) (
  partition p1 values less than (to_days('2000-04-01')),
  partition p2 values less than (to_days('2001-08-01')),
  partition p3 values less than (to_days('2004-11-01')),
  partition p4 values less than (to_days('2008-01-01')),
  partition p5 values less than (to_days('2010-03-01')),
  partition p6 values less than (to_days('2011-04-01')),
  partition p7 values less than (maxvalue)
);

ここでの問題点としては、当然TO_DAYS()を使うのが面倒であるということもあるが、もっと問題なのはSHOW CREATE TABLEでテーブル定義を確認したとき、TO_DAYS()による記述が消失して、TO_DAYS()の計算結果である数値だけが残ってしまうというこ とだ。

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE `t1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `mydate` date NOT NULL,
  PRIMARY KEY (`id`,`mydate`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (to_days(mydate))
(PARTITION p1 VALUES LESS THAN (730576) ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN (731063) ENGINE = InnoDB,
 PARTITION p3 VALUES LESS THAN (732251) ENGINE = InnoDB,
 PARTITION p4 VALUES LESS THAN (733407) ENGINE = InnoDB,
 PARTITION p5 VALUES LESS THAN (734197) ENGINE = InnoDB,
 PARTITION p6 VALUES LESS THAN (734593) ENGINE = InnoDB,
 PARTITION p7 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */

これは非常に解りづらく、管理上デメリットになるだろう。FROM_DAYS()で日付に変換しなおすことはできるが、面倒である。

MySQL 5.5で追加されたRANGE COLUMNSまたはLIST COLUMNSパーティショニングでは、この問題点が解消されている。カラムの値を直接使ってパーティショニングすることが出来るので、テーブル定義は次 のように記述することが出来るようになったのだ。

1
2
3
4
5
6
7
8
9
10
11
12
13
create table t2 (
  id int unsigned not null auto_increment,
  mydate date not null,
  primary key(id,mydate)
) partition by range columns (mydate) (
  partition p1 values less than ('2000-04-01'),
  partition p2 values less than ('2001-08-01'),
  partition p3 values less than ('2004-11-01'),
  partition p4 values less than ('2008-01-01'),
  partition p5 values less than ('2010-03-01'),
  partition p6 values less than ('2011-04-01'),
  partition p7 values less than (maxvalue)
);

当然次のようにSHOW CREATE TABLEには日付そのものが表示される。

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE `t2` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `mydate` date NOT NULL,
  PRIMARY KEY (`id`,`mydate`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50500 PARTITION BY RANGE  COLUMNS(mydate)
(PARTITION p1 VALUES LESS THAN ('2000-04-01') ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN ('2001-08-01') ENGINE = InnoDB,
 PARTITION p3 VALUES LESS THAN ('2004-11-01') ENGINE = InnoDB,
 PARTITION p4 VALUES LESS THAN ('2008-01-01') ENGINE = InnoDB,
 PARTITION p5 VALUES LESS THAN ('2010-03-01') ENGINE = InnoDB,
 PARTITION p6 VALUES LESS THAN ('2011-04-01') ENGINE = InnoDB,
 PARTITION p7 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB) */

解りやすい!

ところで、COLUMNSが複数形になっていることからも分かるように、COLUMNSパーティショニングでは複数のカラムを組み合わせることが出来る。例えば次のような具合に。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
create table t3 (
  id int unsigned not null auto_increment,
  myyear smallint not null,
  mymonth tinyint unsigned not null,
  primary key(id,myyear,mymonth)
) partition by range columns (myyear,mymonth) (
  partition p1 values less than (2000, 4),
  partition p2 values less than (2001, 8),
  partition p3 values less than (2004, 11),
  partition p4 values less than (2008, 2),
  partition p5 values less than (2010, 3),
  partition p6 values less than (2011, 4),
  partition p7 values less than (maxvalue, maxvalue)
);

この例でも分かる通り、COLUMNSパーティショニングでは一つ目のカラムが先に評価され、それでもパーティションが決まらなかった場合には2つ目のカ ラムが評価されることになる。日付の年、月や数値の整数部分、小数部分というように、どちらを先に評価すれば良いかが分かっている場合に使えるテクニック だろう。(年月をわざわざ分けて指定することは少ないと思うが。)

漢(オトコ)のコンピュータ道: MySQL 5.5新機能徹底解説

11ヶ月前 | | 2011年 6月 18日 | このエントリーを含むはてなブックマーク