範囲によるテーブルのパーティショニング
このステップでは、MySQL で範囲によってテーブルをパーティショニングする方法を学びます。範囲によるパーティショニングは、日付、ID、またはその他の数値データなどの値の範囲に基づいてデータを論理的なグループに分割したい場合に便利です。これにより、クエリ性能が向上し、データ管理が容易になります。
まず、MySQL サーバーに接続しましょう。LabEx VM でターミナルを開きます。すでに ~/project
ディレクトリにいるはずです。
mysql -u root -p
パスワードの入力を求められたら、root パスワードを入力します。root パスワードを設定していない場合は、Enter キーを押してください。
次に、sales_data
という名前のデータベースを作成しましょう。
CREATE DATABASE sales_data;
USE sales_data;
次に、sale_id
、sale_date
、および amount
の列を持つ sales
という名前のテーブルを作成します。このテーブルを sale_date
列でパーティショニングします。
CREATE TABLE sales (
sale_id INT PRIMARY KEY,
sale_date DATE NOT NULL,
amount DECIMAL(10, 2) NOT NULL
)
PARTITION BY RANGE (YEAR(sale_date)) (
PARTITION p2020 VALUES LESS THAN (2021),
PARTITION p2021 VALUES LESS THAN (2022),
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION pFuture VALUES LESS THAN MAXVALUE
);
この CREATE TABLE
文を分解してみましょう。
PARTITION BY RANGE (YEAR(sale_date))
: これは、sale_date
列の年を使用して、テーブルを範囲によってパーティショニングすることを指定します。
PARTITION p2020 VALUES LESS THAN (2021)
: これは、sale_date
の年が 2021 未満(つまり、2020 年)のすべての行を含む p2020
という名前のパーティションを作成します。
PARTITION p2021 VALUES LESS THAN (2022)
: これは、sale_date
の年が 2022 未満(つまり、2021 年)のすべての行を含む p2021
という名前のパーティションを作成します。
PARTITION p2022 VALUES LESS THAN (2023)
: これは、sale_date
の年が 2023 未満(つまり、2022 年)のすべての行を含む p2022
という名前のパーティションを作成します。
PARTITION p2023 VALUES LESS THAN (2024)
: これは、sale_date
の年が 2024 未満(つまり、2023 年)のすべての行を含む p2023
という名前のパーティションを作成します。
PARTITION pFuture VALUES LESS THAN MAXVALUE
: これは、sale_date
の年が 2024 以上のすべての行を含む pFuture
という名前のパーティションを作成します。MAXVALUE
は、将来の年もこのパーティションに含まれることを保証します。
次に、sales
テーブルにいくつかのサンプルデータを挿入しましょう。
INSERT INTO sales (sale_id, sale_date, amount) VALUES
(1, '2020-12-31', 100.00),
(2, '2021-01-15', 150.00),
(3, '2021-12-25', 200.00),
(4, '2022-06-01', 120.00),
(5, '2022-12-31', 180.00),
(6, '2023-03-10', 250.00),
(7, '2023-09-20', 300.00),
(8, '2024-01-01', 350.00);
データが正しいパーティションに挿入されたことを確認するには、EXPLAIN PARTITIONS
文を使用できます。例えば:
EXPLAIN PARTITIONS SELECT * FROM sales WHERE sale_date BETWEEN '2021-01-01' AND '2021-12-31';
これにより、MySQL がクエリを実行するために使用するパーティションが表示されます。p2021
パーティションのみを使用することがわかるはずです。
また、次のクエリを使用して、各パーティションの行数を確認することもできます。
SELECT
PARTITION_NAME,
TABLE_ROWS
FROM
INFORMATION_SCHEMA.PARTITIONS
WHERE
TABLE_SCHEMA = 'sales_data' AND TABLE_NAME = 'sales';
このクエリは、sales_data
データベース内の sales
テーブルの各パーティションの名前と行数を取得します。
+----------------+------------+
| PARTITION_NAME | TABLE_ROWS |
+----------------+------------+
| p2020 | 1 |
| p2021 | 2 |
| p2022 | 2 |
| p2023 | 2 |
| pFuture | 1 |
+----------------+------------+
これにより、データが sale_date
に基づいて正しくパーティショニングされたことが確認されます。