MySQL 範囲パーティションを作成する
MySQLで、範囲パーティションを作成する手順を記述してます。
環境
- OS ubuntu21.10
- MySQL Ver 8.0.27-0ubuntu0.21.10.1 for Linux on x86_64 ((Ubuntu))
- MySQL Workbench 8.0.27
手順
以下の「sample」テーブルを作成して、年度ごとにパーティションしてみます。
CREATE TABLE `sample` (
`id` INT AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`created_at` DATETIME NOT NULL,
PRIMARY KEY (`id`, `created_at`)
);
データは、ストアドで作成してます。作成方法は、ストアドで連続した日付データを作成するから確認できます。
SELECT * FROM sample;
実行結果
まずは現在のパーティションの状態を確認してみます。
SELECT TABLE_SCHEMA,
TABLE_NAME,
PARTITION_NAME,
PARTITION_ORDINAL_POSITION,
TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME='sample';
実行結果を見ると、まだパーティションが作成されていないことがわかります。
パーティション作成
年度ごとにパーティションを作成してみます。
ALTER TABLE `sample`
PARTITION BY RANGE COLUMNS(`created_at`) (
PARTITION pat2020 VALUES LESS THAN ('2020-01-01 00:00:00'),
PARTITION pat2021 VALUES LESS THAN ('2021-01-01 00:00:00'),
PARTITION pat2022 VALUES LESS THAN ('2022-01-01 00:00:00'),
PARTITION pat2023 VALUES LESS THAN ('2023-01-01 00:00:00')
)
確認してみます。
※少し時間がたってから確認します。
SELECT TABLE_SCHEMA,
TABLE_NAME,
PARTITION_NAME,
PARTITION_ORDINAL_POSITION,
TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME='sample';
パーティションが作成されていることが確認できます。
パーティションを作成すると、以下のようにパーティションを指定してクエリを実行することが可能です。
SELECT COUNT(*) from sample
PARTITION (`pat2021`);
実行結果
範囲外のデータをinsert
パーティションの範囲外にあるデータをinsertすることはできません。
insert into sample (name,created_at) values('data1001','2024-01-01');
insert into sample (name,created_at) values('data1001','2024-01-01')
Error Code: 1526. Table has no partition for value from column_list 0.000 sec
updateも同様です。
update sample set created_at = '2024-01-01' where id = 1
update sample set created_at = '2024-01-01' where id = 1
Error Code: 1526. Table has no partition for value from column_list 0.000 sec
-
前の記事
jquery 指定した要素のソートを実行する 2022.04.15
-
次の記事
SQL Server 日付から曜日を取得する 2022.04.15
コメントを書く