[laravel]マイグレーションでパーティションを切る方法

LaravelphpMySQLDockerWSL2
[laravel]マイグレーションでパーティションを切る方法

こんにちは
今月(2022/05)から入社した新人の守山と申します。
これからサーバーサイドのエンジニアとして頑張っていきます!

早速本題ですが
laravelでマイグレーションを使ってパーティションを設定するときに
なかなかうまくいかなかったので記録しておきます

前提知識

laravelにパーティションを設定するメソッドがない

解決策

SQLをベタ書きする

想定

logsテーブルのcreated_atにパーティションの設定をします。
ログのデータは膨大になるので処理に時間がかかるので
データの箱に区切りをつけて細かく処理ができるようになります。

ソース

# partitonを設定するカラムは主キーの設定が必要

public function up()
    {
        Schema::create('log', function (Blueprint $table) {
            $table->unsignedBigInteger('id')->comment('ID');
            $table->unsignedInteger('user_id')->default(0)->comment('ユーザID');
            $table->datetime('created_at')->nullable(false)->default(DB::raw('CURRENT_TIMESTAMP'))->comment('作成日時');
            $table->index(['user_id', 'created_at']);
            $table->primary(['id','user_id', 'created_at']);
        });

# PARTITION BY RANGE COLUMNS(`カラム名`)とすることでdatetime型を扱えるようになる。PARTITION BY RANGEとの違いに気をつけよう

        DB::statement("ALTER TABLE l_login PARTITION BY RANGE COLUMNS(`created_at`)(
             PARTITION p202112 VALUES LESS THAN ('2022-01-01 00:00:00'),
             PARTITION p202201 VALUES LESS THAN ('2022-02-01 00:00:00'),
             PARTITION p202202 VALUES LESS THAN ('2022-03-01 00:00:00'),
             PARTITION p202203 VALUES LESS THAN ('2022-04-01 00:00:00'),
             PARTITION p202204 VALUES LESS THAN ('2022-05-01 00:00:00'),
             PARTITION p202205 VALUES LESS THAN ('2022-06-01 00:00:00'),
             PARTITION p202206 VALUES LESS THAN ('2022-07-01 00:00:00'),
             PARTITION p202207 VALUES LESS THAN ('2022-08-01 00:00:00'),
             PARTITION p202208 VALUES LESS THAN ('2022-09-01 00:00:00'),
             PARTITION p202209 VALUES LESS THAN ('2022-10-01 00:00:00'),
             PARTITION p202210 VALUES LESS THAN ('2022-11-01 00:00:00'),
             PARTITION p202211 VALUES LESS THAN ('2022-12-01 00:00:00'),

             PARTITION pmax VALUES LESS THAN (MAXVALUE)
        );");

この記事をシェアする