MySQL 5.5.0-m2リリース

出ました。突然のメジャーバージョンアップですが、これは新しい開発サイクルに基づくものです。曰く、

  • trunkは常にβ版以上の品質を保つ (純粋な新機能の開発は別のstaging treeで行う)
  • 3〜6ヶ月ごとにRC版の品質でマイルストーンリリースを行う
  • 12〜18ヶ月ごとにいずれかのマイルストーンからbranchを切ってGA版のリリースを行う
  • マイルストーンリリースの直後にstaging treeから新機能のマージを行う

という仕組みです。これによって大規模な新機能の追加によるリリースの遅延を抑えるとともに、より安定した品質でのリリースを行うということを狙っているそうです。またMySQL 5.5.0-m2のリリースに伴い、MySQL 5.4.x-betaの更新は終了となります。
MySQL 5.5の新機能からいくつかピックアップしてご紹介します。

  • 準同期レプリケーション。MySQL 5.5の目玉となる機能です。詳しくは漢(オトコ)のコンピュータ道: 最強のMySQL HA化手法 - Semi-Synchronous Replicationをご参照ください。
  • InnoDB Pluginが標準のInnoDBストレージエンジンとしてビルトインされるようになりました。ソースの二重管理はしないと思っていたので私としては予想通りですが、これは大きいですね。
  • RANGE COLUMNSおよびLIST COLUMNSパーティショニング。MySQL 5.1におけるRANGE、LISTパーティショニングの拡張となるものです。

RANGE COLUMNSパーティショニングだけ簡単に確認してみましょう。RANGE COLUMNSパーティショニングは従来のRANGEパーティショニングに比べて、以下の違いがあります。

  • 文字列、DATE、DATETIME型の列をパーティション列として利用可能
  • 複数の列を利用したパーティショニングが可能
  • ただし、評価式を用いたパーティショニングは不可

先日のタイムラインテーブルを題材にすると、典型的には以下のような設計ができるということになります。

mysql> CREATE TABLE timeline (
    ->   id BIGINT(20) NOT NULL,
    ->   created_at DATETIME DEFAULT NULL,
    ->   screen_name VARCHAR(15) DEFAULT NULL,
    ->   text VARCHAR(140) DEFAULT NULL,
    ->   PRIMARY KEY (id, created_at)
    -> )
    -> ENGINE = InnoDB
    -> PARTITION BY RANGE COLUMNS (created_at) (
    ->   PARTITION p2009 VALUES LESS THAN ('2010-01-01'),
    ->   PARTITION p2010 VALUES LESS THAN ('2011-01-01'),
    ->   PARTITION p2011 VALUES LESS THAN ('2012-01-01'),
    ->   PARTITION plast VALUES LESS THAN MAXVALUE
    -> );
Query OK, 0 rows affected (0.05 sec)

いたって普通ですね。MySQL 5.1ではパーティションの評価式はINT値を返さなければならないので、次のように書く必要がありました。

mysql> CREATE TABLE timeline (
    ->   id BIGINT(20) NOT NULL,
    ->   created_at DATETIME DEFAULT NULL,
    ->   screen_name VARCHAR(15) DEFAULT NULL,
    ->   text VARCHAR(140) DEFAULT NULL,
    ->   PRIMARY KEY (id, created_at)
    -> )
    -> ENGINE = InnoDB
    -> PARTITION BY RANGE (TO_DAYS(created_at)) (
    ->   PARTITION p2009 VALUES LESS THAN (TO_DAYS('2010-01-01')),
    ->   PARTITION p2010 VALUES LESS THAN (TO_DAYS('2011-01-01')),
    ->   PARTITION p2011 VALUES LESS THAN (TO_DAYS('2012-01-01')),
    ->   PARTITION plast VALUES LESS THAN MAXVALUE
    -> );
Query OK, 0 rows affected (0.06 sec)

何が違うのかと言われそうですが、MySQL 5.5では1日よりも細かい単位でパーティションを作ったり、パーティションの区切りを0時0分以外にできるところが異なります。私は以前1日よりも細かい単位でパーティションを作れた方が良いのではないかと提案して却下されたことがあるので、これはうれしい新機能です。