LoginSignup
0

More than 1 year has passed since last update.

posted at

データベースのパーティションについて

パーティションとは

1つのテーブルのデータの格納場所を分割する処理のことです。
1つのテーブルの範囲などで分割します。
パーティーションのおかげでDBのパフォーマンスが良くなります。

⚫︎補足
DBはデータベースの略で、これからDBで表現します。

なぜパーティションを使うのか

DBの検索を速くするためです。
そしてデータベースの中身が見やすくなります。

パーティションとはどんなものか。

こちらの記事から画像を引用させていただきます。
https://qiita.com/fuk101/items/603ddb445070aebbfcfa

パーティション化していないと年度別や日付ごとに分けないと
下のようにデータの中身がわかりづらくなってしまいます。

image.png

パーティション化していると
年度別に分割できたりするのでデータの中身がわかりやすくなります。

image.png

パーティションの仕組み

イベントのデータを元に説明します。

 ⚫︎イベントテーブル

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

⚫︎参考資料
https://qiita.com/fuk101/items/603ddb445070aebbfcfa

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
What you can do with signing up
0