ここが新しい!MySQL 5.1

2008年7月1日(火)
奥野 幹也

パーティショニング

 パーティショニングとは、大規模なテーブルを複数の小さなパーティションに分割して性能の向上を図る技術のことです。行ごとにそれぞれパーティションへ振り分けるタイプのものを水平パーティショニングと言い、MySQL 5.1がサポートするのはこのタイプです。パーティショニングは主にデータウェアハウスなどのように巨大なテーブルを使用する場合に威力を発揮します。

 一般的に、Bツリーインデックスは大きくなるにつれ、検索や挿入の速度が低下する(計算のオーダーはO(log m N))のですが、テーブルをパーティションに分けることで、Bツリーインデックスのオーバーヘッドが軽減されます。

 パーティショニングはある特定のカラム値に注目して行われます。そして、カラム値の評価の仕方によって、パーティショニングは4つの種類に分類されます。MySQL 5.1でサポートするパーティショニングの種類を以下に挙げます。

 1つ目が「RANGEパーティショニング」で、カラムの値の範囲をパーティションごとに設定するものです。

 2つ目が「LISTパーティショニング」で、パーティションに振り分けられるべき値を直接指定(リストアップ)するものです。

 3つ目が「HASHパーティショニング」で、整数値のカラムに対してMOD()関数(割り算の余り)によりパーティションの振り分けを行うものです。

 4つ目が「KEYパーティショニング」で、文字列のカラムに対してPASSWORD()関数により算出されるハッシュ値を用いる。

 図2にRANGEパーティショニングを用いたテーブル定義の例を示しました。このテーブルに対してINSERTを行うと、hiredカラムの値によって格納先のパーティションがp0~p3の中から選択されます。

 SELECTなどのステートメントはパーティションがないテーブルと同じように実行できます。以下はSELECTステートメントの例です。

mysql> SELECT id, fname, lname, job_code FROM employees WHERE YEAR(hired) = 2001;

 パーティションを明示的に指定することはできないので、その代わりに特定のパーティションだけがクエリの対象になるように、WHERE句を書きます。実際にパーティションがうまく使われているかどうかを確認するには、EXPLAIN PARTITIONSコマンドを利用します。従来のEXPLAINではパーティション情報が出てこない点に注意してください。

mysql> EXPLAIN PARTITIONS SELECT ...(略)...;

イベントスケジューラ

 イベントスケジューラはワンタイム、または定期的にイベント(ジョブ)を実行するための仕組みです。イベントは単一のSQLステートメント、BEGIN~ENDで囲まれた一連のSQLステートメント、またはストアドプロシージャで記述することができます。

 同じようなことをcronやタスクスケジューラなどを用いて実行することはできるのですが、cronはUNIX固有でWindowsでは動きません。イベントスケジューラはプラットホームに依存しないため特にOSを気にすることなく使うことができるという利点があります。

 また、mysqldumpを使えばイベントスケジューラ自身をバックアップすることができます。そのバックアップをリストアするだけでジョブのスケジュールもリストアすることができるので、個別にcronの設定を行う必要がなく管理上のメリットがあります。

 イベントスケジューラの使い方について説明します。デフォルトではイベントスケジューラの機能がOFFになっているので、まずは有効にする設定をします。--event-schedulerオプションをつけてmysqldを起動するか、既にmysqldが動いているのであれば以下のステートメントを使って機能を有効にします。

mysql> SET GLOBAL event_scheduler=ON;

 イベントを作成、変更、削除するにはそれぞれCREATE EVENT、ALTER EVENT、DROP EVENT構文を用います。CREATE EVENTの構文を図2に示しています。

 CREATE EVENTの構文のうち[]で囲まれたところはオプションです。DEFINERはイベントを実行するユーザーアカウントです。デフォルトはCURRENT_USERです。ENABLE | DISABLE | DISABLE ON SLAVEはイベントが初期状態で有効かどうかを指定します。DISABLE ON SLAVEはレプリケーションを設定している時に使うオプションです。

 ON SCHEDULEは次のように指定します。以下はワンタイムイベントの場合の指定です。

AT timestamp [+ INTERVAL interval]

 繰り返し実行されるイベントの場合は、以下のように指定します。

EVERY interval
[STARTS timestamp [+ INTERVAL interval]]
[ENDS timestamp [+ INTERVAL interval]]

 繰り返し実行するイベントでは開始日時と終了日時を記載することができます。EVERY intervalで繰り返しの周期を指定し、+ INTERVAL interval句ではtimestampからの相対的な期間を指定します。例えば、1時間後から5分おきに実行するような場合は、EVERY 5 MINUTES STARTS CURRENT_TIMESTAMP + INTERVAL 1 HOURというように指定します。

 DO sql_statementの個所はこの章の冒頭でも述べた通り、単一のSQLステートメント、BEGIN~ENDで囲まれた一連のSQLステートメント、またはストアドプロシージャの呼び出しです。以下にCREATE EVENTの具体的な例を表します。

mysql> CREATE EVENT ev_optimize
-> ON SCHEDULE EVERY 1 WEEK STARTS '2008-07-01'
-> DO OPTIMIZE TABLE my_db.my_table;

 CREATE EVENTの実行にはEVENT権限が必要です。GRANT EVENT...でイベントを作成するユーザーアカウントに対して権限を与えておきましょう。イベントスケジューラを使うとジョブの実行において選択肢が広がります。ぜひ運用に役立ててください。

サン・マイクロシステムズ株式会社
MySQLサポートエンジニア。MySQLサーバー本体のほかにMySQL Cluster、DRBDなどを担当。障害解析からパフォーマンスチューニングまで幅広く対応。OSSの普及をライフワークとしている。http://nippondanji.blogspot.com/

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています