パーティションとは
1つのテーブルのデータの格納場所を分割する処理のことです。
1つのテーブルの範囲などで分割します。
パーティーションのおかげでDBのパフォーマンスが良くなります。
⚫︎補足
DBはデータベースの略で、これからDBで表現します。
なぜパーティションを使うのか
DBの検索を速くするためです。
そしてデータベースの中身が見やすくなります。
パーティションとはどんなものか。
こちらの記事から画像を引用させていただきます。
https://qiita.com/fuk101/items/603ddb445070aebbfcfa
パーティション化していないと年度別や日付ごとに分けないと
下のようにデータの中身がわかりづらくなってしまいます。
パーティション化していると
年度別に分割できたりするのでデータの中身がわかりやすくなります。
パーティションの仕組み
イベントのデータを元に説明します。
⚫︎イベントテーブル
ID | 都道府県 | イベント名 | 開催年月日 |
---|---|---|---|
1 | 東京 | Aさんのライブ | 2022年1月20日 |
2 | 大阪 | Bさんの試写会 | 2021年12月26日 |
3 | 福岡 | Cさんの講演会 | 2020年6月20日 |
4 | 東京 | Dさん展示会 | 2021年4月20日 |
5 | 大阪 | Eさんのサイン会 | 2021年4月20日 |
これを都道府県ごとに分割します。
東京なら東京、大阪なら大阪、福岡なら福岡にデータが格納されているイメージです。
何らかのグループに分けてみていきます。
テーブル | |
---|---|
都道府県 | ID |
東京 | 1,4 |
大阪 | 2,5 |
福岡 | 3 |
大阪のデータを取るSQL文を書いてみます。
SELECT * FROM イベントテーブル
WHERE 都道府県 = 大阪
大阪だけ検索すれば大阪のでデータが取れ上のように文が短くて済みます。
パーティションを使わないと
SELECT * FROM イベントテーブル
WHERE 都道府県 = 大阪 AND イベント名 = Dさん展示会
みたいに余計にSQL文を書くことになります。
パーティションの種類
パーティションの種類について説明していきます。
1.リストパーティション
キーカラムを固定値
で分割する方法です。
キーカラムは今回は都道府県です。
ID | 都道府県 | イベント名 | 開催年月日 |
---|---|---|---|
1 | 東京 | Aさんのライブ | 2022年1月20日 |
2 | 大阪 | Bさんの試写会 | 2021年12月26日 |
3 | 福岡 | Cさんの講演会 | 2020年6月20日 |
4 | 東京 | Dさん展示会 | 2021年4月20日 |
5 | 大阪 | Eさんのサイン会 | 2021年4月20日 |
テーブル | |
---|---|
都道府県 | ID |
東京 | 1,4 |
大阪 | 2,5 |
福岡 | 3 |
2.レンジパーティション
キーカラムの値の範囲
で分割する方法です。
下のように格納されます。
ID | 都道府県 | イベント名 | 開催年月日 |
---|---|---|---|
1 | 東京 | Aさんのライブ | 2022年1月20日 |
2 | 大阪 | Bさんの試写会 | 2021年12月26日 |
3 | 福岡 | Cさんの講演会 | 2020年6月20日 |
4 | 東京 | Dさん展示会 | 2021年4月20日 |
5 | 大阪 | Eさんのサイン会 | 2021年4月20日 |
テーブル | |
---|---|
開催年月日 | ID |
2020年1月1日~2020年12月31日 | 3 |
2021年1月1日~2021年12月31日 | 2,4,5 |
2022年1月1日~2022年12月31日 | 1 |
3.ハッシュパーティション
均等に分割する方法です。
ID | 都道府県 | イベント名 | 開催年月日 |
---|---|---|---|
1 | 東京 | Aさんのライブ | 2022年1月20日 |
2 | 大阪 | Bさんの試写会 | 2021年12月26日 |
3 | 福岡 | Cさんの講演会 | 2020年6月20日 |
4 | 東京 | Dさん展示会 | 2021年4月20日 |
5 | 大阪 | Eさんのサイン会 | 2021年4月20日 |
上のキーカラムをハッシュ化すると必ずA,B,Cのどれかに当てはまる。
1 A
2 B
3 C
4 D
5 A
テーブル | |
---|---|
パーティション | ID |
パーティションA | |
パーティションB | |
パーティションC | |
パーティションD |
パーティションの追加
パーティションの追加の説明です。
⚫︎イベントテーブル
ID | 都道府県 | イベント名 | 開催年月日 |
---|---|---|---|
1 | 東京 | Aさんのライブ | 2022年1月20日 |
2 | 大阪 | Bさんの試写会 | 2021年12月26日 |
3 | 福岡 | Cさんの講演会 | 2020年6月20日 |
4 | 東京 | Dさん展示会 | 2021年4月20日 |
5 | 大阪 | Eさんのサイン会 | 2021年4月20日 |
レンジパーティション作成のSQL文です。
ALTER TABLE イベントテーブル PARTION BY RANGE (YEAR(開催年月日))(
PARTITION p2019 VALUES LESS THAN (2019) ENGINE = InnoDB,
PARTITION] p2020 VALUES LESS THAN (2020) ENGINE = InnoDB,
PARTITION p2021 VALUES LESS THAN (2021) ENGINE = InnoDB,
PARTITION pmax VALUES MAXVALUE --pmaxは2021年以降のデータが入ってきた時に備えて
);
MySQLを使う時の注意点
パーティションのキーカラムは
プライマリキー or ユニークキーにします。
⚫︎イベントテーブル
ID | 都道府県 | イベント名 | 開催年月日 |
---|---|---|---|
1 | 東京 | Aさんのライブ | 2022年1月20日 |
2 | 大阪 | Bさんの試写会 | 2021年12月26日 |
3 | 福岡 | Cさんの講演会 | 2020年6月20日 |
4 | 東京 | Dさん展示会 | 2021年4月20日 |
5 | 大阪 | Eさんのサイン会 | 2021年4月20日 |
CREATE TABLE tbl name ..., PRIMARY KEY(ID,開催年月日)
--(ID,開催年月日)が複合プライマリキー
注意点
・パーティションよりインデックスを優先的に使う
・WHERE句にはキーカラムを含める
・外部キー制約が使えない(My SQL)
⚫︎参考動画
せお丸さんの動画
https://m.youtube.com/watch?v=Aur62VsPrHg&list=PL-1KBX2gDRujQaRgEByueezHBiqHP8KDD&index=9