RailsでMySQLパーティショニングのマイグレーション

スポンサーリンク

Rails で MySQL パーティショニングを使いたかったのですが、マイグレーションを書くのにちょっとコツが必要だったので備忘録メモです。MySQL のパーティショニングを使う場合、通常のテーブルとは違って、色々と制約や制限があります。それらの制約を守ったり、制限を回避しつつマイグレートを書かなければなりません。詳しくは以下。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 19.6 パーティショニングの制約と制限

— 環境 —
Rails 5.1
ActiveRecord 5.1
MySQL 5.6

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

MySQL パーティショニング利用での制約と制限

MySQL の公式ドキュメントに詳しく書いてありますが、DBの主キーやユニークキーについて、以下のルールを守る必要があります。

パーティション化されたテーブルのパーティショニング式で使用されるすべてのカラムは、テーブルが持つことができるすべての一意キーの一部である必要があります。

つまり、テーブルのすべての一意キーは、テーブルのパーティショニング式内のすべてのカラムを使用する必要があります(これには、テーブルの主キーも含まれます (自明で一意キーであるため)。

他にも、外部キーが使えないなど色々な制約・制限がありますので注意が必要です。

とりあえずパーティショニング作成における、主キーとユニークキーのルールを守るために、マイグレーションで以下のアプローチを取りました。

1. 一旦、デフォルトのプライマリーキーである id カラムを作成しないようにする。
2. プライマリキーと AUTO_INCREMENT 設定のない id カラムを明示的に作成。
3. テーブルを生成。
4. ユニークインデックス追加(add_index)には、パーティショニングに使うカラムを含めて複合ユニークにする。
5. ALTER TABLE で、id カラムとパーティショニングに使うカラムで複合プライマリキーを追加。
6. ALTER TABLE で、id カラムに AUTO_INCREMENT を追加。
7. ALTER TABLE で、パーティションを追加。

MySQL パーティション設定のマイグレーション

articles テーブルにおいて、posted_at カラムでパーティショニングを行う場合の例です。

「create_table :articles, id: false」で、ActiveRecord デフォルトの id カラムが生成されなくなる。なので、ブロック内で明示的に id カラムを作成しています。この明示的に追加した id カラムには、プライマリキーと AUTO_INCREMENT の設定がない状態です。パーティショニングの制約・制限を守るために、後で ALTER TABLE でプライマリキーと AUTO_INCREMENT を追加するようにしました。

また、重複投稿がないように、content カラムにユニークキーを張りたいのだけど、単独でするとエラーになってしまいます。パーティショニングを利用する場合、ユニークキーにパーティショニングに使うカラムを含める必要があるためです。なので、posted_at カラムを含めて複合ユニークを作成しました。

「add partitions for 30 years」の30年分(360ヶ月分)のパーティションを作成する部分は、実際には以下のような SQL を発行します。1行ずつ書くのはしんどいので Ruby コードでクエリを組み立てました。

このマイグレーション実行で、30年分のパーティションを持つ articles テーブルが作成されます。

Article モデルの設定

ActiveRecord のモデル側(Article モデル)では、プライマリキーは :id だけで良いので以下のように書きます。

この設定を書かないと、Sidekiq などで「ActiveRecord は composite primary keys をサポートしてないよ」的なエラーが出た記憶があります。

パーティショニングされたレコードの確認

posted_at カラムを適当に設定して、いくつかレコードを保存した後、以下の SQL 発行で確認。

レコードがパーティションに分散されて保存されていることが確認できました。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
 
スポンサーリンク

Leave Your Message!