LoginSignup
4
4

More than 5 years have passed since last update.

MySQL 5.7 - パーティションデータの退避(移動)パフォーマンス改善

Last updated at Posted at 2016-09-02

概要

レコード数が少ない間は問題にならなかったけど、レコード数が多くなると
select insertでコピーするのは厳しくなってきたので、
EXCHANGE PARTITIONでパーティションデータを別テーブルに移動させてみました。
(古くなったデータをアーカイブするときに便利)

準備

テーブル作成

中間テーブルとアーカイブ用テーブルを作成します。
中間テーブルは元テーブルとパーティション以外は同じ定義にしないとダメで、
アーカイブ用テーブルは移動元テーブルと同じ定義にします。

show create table で確認して移動元と同じ定義でテーブルを作ったけど、エラーが、、

Non matching attribute 'ROW_FORMAT' between partition and table

show table status likeでROW_FORMATを確認してみると異なってました。
create table or alter tableで移動元と同じROW_FORMATを指定してください。

処理

パーティションpをpartitioned_dataからpartitioned_data_archiveに移動させます。

中間テーブルを空にする

TRUNCATE TABLE no_partitioned_data_tmp;

パーティションpをpartitioned_dataから中間テーブルに移動

ALTER TABLE partitioned_data 
EXCHANGE PARTITION p 
WITH TABLE no_partitioned_data_tmp 
WITHOUT VALIDATION;

中間テーブルのデータをpartitioned_data_archiveのパーティションpに移動

ALTER TABLE partitioned_data_archive 
EXCHANGE PARTITION p 
WITH TABLE no_partitioned_data_tmp 
WITHOUT VALIDATION;

partitioned_dataのパーティションpを削除

ALTER TABLE partitioned_data DROP PARTITION p;

結果

30分程度掛かるパーティションデータの退避処理が5秒程度に改善されました。
MySQL5.7から EXCHANGE PARTITION のオプションで移動元テーブルの
データ検証を行わない WITHOUT VALIDATION が追加されてますので
範囲外のデータがないことが保証されてる場合はこちらを指定すると低コストで移動できます。

参考

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4