パーティショニング

パーティショニング

 パーティショニングとは、大規模なテーブルを複数の小さなパーティションに分割して性能の向上を図る技術のことです。行ごとにそれぞれパーティションへ振り分けるタイプのものを水平パーティショニングと言い、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...でイベントを作成するユーザーアカウントに対して権限を与えておきましょう。イベントスケジューラを使うとジョブの実行において選択肢が広がります。ぜひ運用に役立ててください。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30