2009-10-21

MySQLパーティショニングについて(その1:基本知識編)

はてなブックマーク   livedoor clip

初めまして、リコーの濱田です。このたび私も本ブログを担当することになりました。今後ともよろしくお願いいたします。

本エントリではデータベースに関する技術トピックとして、MySQL 5.1 から導入された機能であるパーティショニングについて書こうと思います。少し長くなりそうなので、「基本知識編」「性能検証編」の2回に分けて書くことにします。

今回は「基本知識編」として、パーティショニングの概要と基本的な使い方について紹介します。

パーティショニングの概要

パーティショニングとは、事前に設定されたルールに従ってデータをパーティションと呼ばれる部分的なテーブルに分割する仕組みです。

データ挿入時には、設定ルールに従ってデータが該当するパーティションに自動的に振り分けられます。データ参照時には、オプティマイザがクエリから必要なパーティションを判断し、該当するパーティションのみにアクセスします。これらは MySQL の内部で行なわれるため、データの操作においてパーティショニングを意識する必要はありません。
partitioning
パーティショニングを利用することで、以下の利点が得られます。

  • 大量のデータを処理することによる性能上のボトルネックの発生を抑えられる
  • テーブルサイズに上限がある場合(MyISAMなど)でも、その上限を超える量のデータを格納できる

パーティションドテーブルの作成

それでは実際にパーティションドテーブル(パーティショニングされたテーブル)を作成してみます。パーティショニングにはいくつかの種類がありますが、ここでは RANGE パーティショニングについて説明します。

パーティションドテーブルの作成は簡単で、通常のテーブル作成文の後にパーティション設定ルールの記述を追加するだけです。以下の例は、複数クライアントのログ情報を月別に分けて格納するパーティションドテーブルの作成例です。

CREATE TABLE logs (
    id INT NOT NULL AUTO_INCREMENT,
    client_name VARCHAR(32) NOT NULL,
    log_data VARCHAR(1024) NOT NULL,
    logged_at DATETIME NOT NULL,
    PRIMARY KEY(id, logged_at),
    INDEX(client_name)
) ENGINE=MyISAM
PARTITION BY RANGE( TO_DAYS(logged_at) ) (
    PARTITION p200910 VALUES LESS THAN ( TO_DAYS('2009-11-01') ),
    PARTITION p200911 VALUES LESS THAN ( TO_DAYS('2009-12-01') ),
    PARTITION p200912 VALUES LESS THAN ( TO_DAYS('2010-01-01') ),
    PARTITION pmax VALUES LESS THAN MAXVALUE
);

PARTITION BY RANGE 以下がパーティション設定ルールです。上記の例では p200910、p200911、p200912、pmax という名前の4つのパーティションが作成され、TO_DAYS(logged_at) の値を基にデータが各パーティションに振り分けられる設定になっています。例えば、logged_at が ‘2009-11-01′ より小さいデータは p200910 に格納されるといった具合です。ここで、振り分けに利用される表現(上記例では TO_DAYS(logged_at) )を「パーティショニング表現」と呼びます。

パーティション設定ルールの最後の行の “VALUES LESS THAN MAXVALUE” は「キャッチオール」節と呼ばれるものです。MAXVALUE は表現可能な最大整数値を表すので、logged_at が ‘2010-01-01′ 以上となるデータは全て pmax に格納されます。これが無いと、logged_at が ‘2010-01-01′ 以上となるデータを格納する場合にエラーが起こります。

なお、パーティションドテーブルの作成に際してはいくつかの制約があります。以下に代表的なものを挙げておきます。

  • パーティショニング表現に用いられるカラムはテーブル内に存在するプライマリキー(またはユニークキー)の一部でなければならない
    • プライマリキー(またはユニークキー)が存在しない場合は例外
  • パーティション表現は連続した整数値をとるものでなければならない
    • 日付データを利用する場合、TO_DAYS() 関数などを使って整数値に直す必要がある
  • 作成できるパーティションの上限は1テーブルにつき1024個

パーティションの追加

既存のパーティションドテーブルから更にパーティションを追加する方法は2つあります。

  • ADD PARTITION を使って新規パーティションを追加する方法
  • REORGANIZE PARTITION を使って既存のパーティションを再分割する方法

ただし、既存のパーティションドテーブルに「キャッチオール」節が存在する場合は後者の方法しか選択肢がありません。

以下にそれぞれの方法について説明します。

ADD PARTITION を使う方法

既存のパーティションドテーブルにパーティションを新規追加するには以下のようにします。

ALTER TABLE logs ADD PARTITION (
    PARTITION p201001 VALUES LESS THAN ( TO_DAYS('2010-02-01') )
);

注意点として、RANGE パーティショニングされているテーブルにおいて、ADD PARTITION は既存パーティションの「後」にしかパーティション追加ができません(「前」や「間」はNGです)。そのため、「キャッチオール」節(MAXVALUE)が既に存在する場合は(MAXVALUE より後の値は存在し得ないため)、この方法が使えません。

REORGANIZE PARTITION を使う方法

既存のパーティションを再分割するには以下のようにします。この例では、pmax を p201001 と、(新しい) pmax に再分割しています。

ALTER TABLE logs REORGANIZE PARTITION pmax INTO (
    PARTITION p201001 VALUES LESS THAN ( TO_DAYS('2010-02-01') ),
    PARTITION pmax VALUES LESS THAN MAXVALUE
);

REORGANIZE PARTITION を行なうと、既存のデータが再分割後のパーティションに適切に振り分けられます。例えば上記の例では、旧 pmax に格納されていたデータのうち logged_at が ‘2009-02-01′ より小さいものは p201001 に、’2009-02-01′ 以上のものは 新 pmax に格納されます。この再振り分け処理により、既存データが大量にある場合は REORGANIZE PARTITION の実行にそれなりの時間がかかります。

REORGANIZE PARTITION は、既存パーティションの結合にも利用できます。例えば、p200910 と p200911 を結合したい場合は以下のようにします。

ALTER TABLE logs REORGANIZE PARTITION p200910, p200911 INTO (
    PARTITION p200910_11 VALUES LESS THAN ( TO_DAYS('2009-12-01') )
);

さらに、既存の複数パーティションを新しい複数パーティションに再構成することもできます。

ALTER TABLE logs REORGANIZE PARTITION p200910, p200911, p200911, pmax INTO (
    PARTITION p200909_10 VALUES LESS THAN ( TO_DAYS('2009-11-01') ),
    PARTITION p200911_12 VALUES LESS THAN ( TO_DAYS('2010-01-01') ),
    PARTITION pmax VALUES LESS THAN MAXVALUE
);

パーティションの削除

パーティションドテーブルから特定のパーティションを削除するには、以下のようにしてパーティションごと DROP します。

ALTER TABLE logs DROP PARTITION p200912;

上記の例では、パーティション p200912 および p200912 に格納されているデータが全て削除されます。また、上記例の実行前に p200910、p200911、p200912、pmax のパーティションがあった場合、p200912 が削除されたことで logged_at が ‘2009-12-01′ 以上となるデータは全て pmax に格納されるようになります。

パーティションの削除は内部的にテーブルの DROP とほぼ同じであるため、(ストレージエンジンが MyISAM や InnoDB の場合であれば)格納されているデータ件数によらず一瞬で処理が完了します。

パーティショニングの解除

パーティションドテーブルからパーティションを取り除き、通常のテーブルにするには以下のようにします。

ALTER TABLE logs REMOVE PARTITIONING;

DROP PARTITION とは異なり、各パーティションに格納されているデータは削除されません。各パーティションのデータを一つのテーブルにマージするため、既存データが大量にある場合は REMOVE PARTITIONING の実行にそれなりの時間がかかります。

まとめ

本エントリでは、MySQL 5.1 から導入された機能であるパーティショニングについて概要を説明し、RANGE パーティショニングによるパーティションドテーブルの作成、パーティションの追加・削除、パーティショニングの解除方法について具体例を交えて説明しました。RANGE パーティショニング以外のパーティショニング方法などパーティショニングについてより深く知りたい方は、MySQL 5.1 リファレンスマニュアル :: 15 パーティショニング を一読されると良いと思います。

次回のエントリでは、パーティションドテーブルに対して実際にデータを挿入・参照することでパーティショニングの性能面を検証してみようと思います。お楽しみに!

2009-10-15

進化する携帯電話

はてなブックマーク   livedoor clip

はじめまして。リコーの梅原です。今回から私もブログを書くことになりました。宜しくお願いします。私の一つ目のエントリーは、Androidについて書こうと思います。

Android携帯

国内初のAndroid搭載端末HT-03Aが2009年7月にNTT docomoから発売されました。皆様ご存知でしょうか?

海外でもMotorola CLIQHTC HeroLG-GW62等の端末が続々とリリースされていて、最近ではDellもAndroid搭載のスマートフォンを発売すると報道されています。Android端末が世界中で増えつつありますね。

実は私もHT-03Aの購入者の一人なのですが、携帯電話の変更連絡を友人や家族にしたときに、多くの人から「何それ?」と言われてしまいました。いやいや、これは今までに無い素晴らしい携帯電話なんです。

今回は、私が感じたAndroid携帯の魅力を3つに絞って皆様にお伝えできればと思います。

魅力1 携帯電話もリアルタイムの世界へ

まずAndroid携帯を使っていて驚かされる事はデータの同期および通知がリアルタイムであるということです。

一つ目のデータの同期とはGmail、アドレス帳、Google Calendar等のアプリケーションのローカルデータとGoogleのクラウド上にあるデータがリアルタイムに同期するということです。

今までの同期といえば、デバイスとPCをUSBでつないで・・・、という面倒な作業が頭をよぎりますが、何もしなくてもインターネット経由で勝手に同期してくれます。例えば、携帯電話で作成しているメールの内容をリアルタイムにPCで確認することができます。これなら携帯電話で作成した文書を途中からPCで編集!ってことも簡単です。他にもPCでアドレス帳を編集したり顔写真を追加したりしていると、気がついたときには携帯電話にデータ・画像が反映されています。データの同期がリアルタイムであるというメリットはおわかりいただけたでしょうか。

二つ目のデータの通知というのは、Gmail、GTalk、Twitter等の複数のアプリケーションからリアルタイムにデータが通知されるということです。

これはAndroidの特徴でもある「マルチタスク」が威力を発揮しています。例えば、Gmailでメールを作成しているときに、GTalkからのメッセージ受信通知、Twitterの発言通知、アプリケーションのアップデート通知等々、ありとあらゆる情報がどんどん通知されてきて、それが容易にタスクバーで把握可能です。

今までの携帯電話では考えられない世界だと思いませんか?Googleはリアルタイムな通信基盤を構築しようとしています。Androidはその一部です。この周辺技術を理解していくとリアルタイム通信というのが重要であることがわかるので、関連するChrome OSGoogle Waveも紹介したいところですが、紙面の都合で次回以降に回します。

魅力2 オープンな携帯電話

次の魅力はAndroidがオープンソース、ロイヤリティーフリーであるということです。

Androidは携帯電話のためのものだけではありません。Androidはフルスタックソフトウェアであり、OS、ミドルウェア、アプリケーションフレームワークをモバイル機器(組み込み機器)向けに提供しているのです。メーカーは携帯電話をはじめとするモバイル機器を開発し、その上で動くアプリケーションを3rdパーティーが開発することが可能になるというわけです。

携帯電話だけでなく、情報家電、車載機器、セットトップボックス等がAndroidへの新しいプラットフォームへ移行することで、OSのロイヤリティがかからない上に機器による開発環境の違いも吸収できることになります。エミュレーターも充実しているので開発コストも低く抑えられることでしょう。そして言語はJava。私はJavaが好きなのでかなり魅力を感じています(笑)。

How Android works: The big picture」の記事のAndroidのシステムアーキテクチャを見てみると、Web開発者であればご存知の「WebKit」や「SQLite」を初めとするライブラリとアプリケーションフレームワークがありとても魅力的です。携帯電話の開発といえばDoja、MIDP、starプロファイルが頭をよぎるのですが、自由度や機能面でいうと全然違います。「All application are created equal」というように、電話帳アプリケーションだって置きかえられるくらいの高い自由度を備えてます。もちろんユーザインタフェースはiPhoneにはまだまだ及びませんが、洗練されたUIを作る事も可能でしょう。

これはAndroidプラットフォームの魅力のほんの一部です。これからどんどん新しい端末がローコストで出てくるのが楽しみですね。

魅力3 強力なアプリケーション

AndroLib.comの統計によると2009年10月1日現在、約1万2000本のアプリケーションが登録されています。統計を見ると面白いですね。毎日約50もの新しいアプリケーションが生まれています。

そして、未完成の携帯電話をどんどん自分に最適な機能を持つアプリケーションをインストールしてカスタマイズしていくわけです。今までの携帯電話より愛着が湧きますよね。アプリケーションは新着ランキングを見て気に入ったアプリケーションをインストールするのが一番良いと思います。

最後に私の愛用しているアプリケーションの一部を紹介して終わりにしたいと思います。
Android携帯をお持ちの方はこのアプリをインストールしてみてください。

OpenWnnフリック入力対応版
 フリック入力に対応しており、素早く文字入力が可能です。最近は絵文字入力に対応しています。(標準だと絵文字入力はできないんです)

Any CutUltimateFaves 
 さまざまなショートカットを作成できます

PicSay 
 画像編集ならこれが便利です

e電話帳
 今までの携帯電話の検索に近い形になるので重宝しています

QR我風 
 自分の連絡先のQRコードを作成できます

路線ドロイド 
 乗り換え案内はこれを使っています

WiFi OnOff 
 WiFiの切り替えを簡単にすることができます