タグ: #MySQL
COLUMNS PARTITIONING
大規模なデータを扱うときに便利なパーティショニングにも嬉しい改良が加えられている。従来 のRANGEパーティショニングでは評価式が必ずINT型の結果を返すようにする必要があった。具体的に言うと、日付型のカラムを用いる場合には次のよう にTO_DAYS()関数を用いるなどという対処が必要であった。
12345678910111213createtablet1 (idintunsignednotnullauto_increment,mydatedatenotnull,primarykey(id,mydate)) partitionbyrange (to_days(mydate)) (partition p1valuesless than (to_days('2000-04-01')),partition p2valuesless than (to_days('2001-08-01')),partition p3valuesless than (to_days('2004-11-01')),partition p4valuesless than (to_days('2008-01-01')),partition p5valuesless than (to_days('2010-03-01')),partition p6valuesless than (to_days('2011-04-01')),partition p7valuesless than (maxvalue));
ここでの問題点としては、当然TO_DAYS()を使うのが面倒であるということもあるが、もっと問題なのはSHOW CREATE TABLEでテーブル定義を確認したとき、TO_DAYS()による記述が消失して、TO_DAYS()の計算結果である数値だけが残ってしまうというこ とだ。
12345678910111213CREATETABLE`t1` (`id`int(10) unsignedNOTNULLAUTO_INCREMENT,`mydate`dateNOTNULL,PRIMARYKEY(`id`,`mydate`)) ENGINE=InnoDBDEFAULTCHARSET=utf8/*!50100 PARTITIONBYRANGE (to_days(mydate))(PARTITION p1VALUESLESS THAN (730576) ENGINE = InnoDB,PARTITION p2VALUESLESS THAN (731063) ENGINE = InnoDB,PARTITION p3VALUESLESS THAN (732251) ENGINE = InnoDB,PARTITION p4VALUESLESS THAN (733407) ENGINE = InnoDB,PARTITION p5VALUESLESS THAN (734197) ENGINE = InnoDB,PARTITION p6VALUESLESS THAN (734593) ENGINE = InnoDB,PARTITION p7VALUESLESS THAN MAXVALUE ENGINE = InnoDB) */
これは非常に解りづらく、管理上デメリットになるだろう。FROM_DAYS()で日付に変換しなおすことはできるが、面倒である。
MySQL 5.5で追加されたRANGE COLUMNSまたはLIST COLUMNSパーティショニングでは、この問題点が解消されている。カラムの値を直接使ってパーティショニングすることが出来るので、テーブル定義は次 のように記述することが出来るようになったのだ。
12345678910111213createtablet2 (idintunsignednotnullauto_increment,mydatedatenotnull,primarykey(id,mydate)) partitionbyrange columns (mydate) (partition p1valuesless than ('2000-04-01'),partition p2valuesless than ('2001-08-01'),partition p3valuesless than ('2004-11-01'),partition p4valuesless than ('2008-01-01'),partition p5valuesless than ('2010-03-01'),partition p6valuesless than ('2011-04-01'),partition p7valuesless than (maxvalue));
当然次のようにSHOW CREATE TABLEには日付そのものが表示される。
12345678910111213CREATETABLE`t2` (`id`int(10) unsignedNOTNULLAUTO_INCREMENT,`mydate`dateNOTNULL,PRIMARYKEY(`id`,`mydate`)) ENGINE=InnoDBDEFAULTCHARSET=latin1/*!50500 PARTITIONBYRANGE COLUMNS(mydate)(PARTITION p1VALUESLESS THAN ('2000-04-01') ENGINE = InnoDB,PARTITION p2VALUESLESS THAN ('2001-08-01') ENGINE = InnoDB,PARTITION p3VALUESLESS THAN ('2004-11-01') ENGINE = InnoDB,PARTITION p4VALUESLESS THAN ('2008-01-01') ENGINE = InnoDB,PARTITION p5VALUESLESS THAN ('2010-03-01') ENGINE = InnoDB,PARTITION p6VALUESLESS THAN ('2011-04-01') ENGINE = InnoDB,PARTITION p7VALUESLESS THAN (MAXVALUE) ENGINE = InnoDB) */
解りやすい!
ところで、COLUMNSが複数形になっていることからも分かるように、COLUMNSパーティショニングでは複数のカラムを組み合わせることが出来る。例えば次のような具合に。
1234567891011121314createtablet3 (idintunsignednotnullauto_increment,myyearsmallintnotnull,mymonth tinyint unsignednotnull,primarykey(id,myyear,mymonth)) partitionbyrange columns (myyear,mymonth) (partition p1valuesless than (2000, 4),partition p2valuesless than (2001, 8),partition p3valuesless than (2004, 11),partition p4valuesless than (2008, 2),partition p5valuesless than (2010, 3),partition p6valuesless than (2011, 4),partition p7valuesless than (maxvalue, maxvalue));
この例でも分かる通り、COLUMNSパーティショニングでは一つ目のカラムが先に評価され、それでもパーティションが決まらなかった場合には2つ目のカ ラムが評価されることになる。日付の年、月や数値の整数部分、小数部分というように、どちらを先に評価すれば良いかが分かっている場合に使えるテクニック だろう。(年月をわざわざ分けて指定することは少ないと思うが。)
漢(オトコ)のコンピュータ道: MySQL 5.5新機能徹底解説
11ヶ月前 | 固定リンク | 2011年 6月 18日 | 
