3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MySQLのパーティショニングの詰まったところ

Last updated at Posted at 2022-03-06

MySQLのパーティショニングの詰まったところです。
同じエラーになった方は参考になるかもしれません。

一覧

  • A UNIQUE INDEX must include all columns in the table's partitioning function
  • Foreign keys are not yet supported in conjunction with partitioning
  • A PRIMARY KEY must include all columns in the table's partitioning function

サンプルテーブル作成

テーブル作成
SET FOREIGN_KEY_CHECKS=0;

CREATE TABLE categories (
  id INT UNSIGNED NOT NULL PRIMARY KEY auto_increment,
  name VARCHAR(255) NOT NULL UNIQUE
) character SET utf8mb4 collate utf8mb4_bin;

CREATE TABLE posts (
  id INT UNSIGNED NOT NULL PRIMARY KEY auto_increment,
  category_id INT UNSIGNED NOT NULL,
  content text,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT posts_ibfk_1 FOREIGN KEY (category_id) REFERENCES categories(id)
) character SET utf8mb4 collate utf8mb4_bin;

SET FOREIGN_KEY_CHECKS=1;

パーテーション作成

categoriesテーブルのパーテーション作成
/* (A) */
ALTER TABLE categories
PARTITION BY RANGE COLUMNS(id) (
    PARTITION p10 VALUES LESS THAN (10),
    PARTITION p20 VALUES LESS THAN (20),
    PARTITION p30 VALUES LESS THAN (30)
);
postsテーブルのパーテーション作成
/* (B) */
ALTER TABLE posts
PARTITION BY RANGE COLUMNS(created_at) (
    PARTITION p202202 VALUES LESS THAN ('2022-03-01 00:00:00'),
    PARTITION p202203 VALUES LESS THAN ('2022-04-01 00:00:00'),
    PARTITION p202204 VALUES LESS THAN ('2022-05-01 00:00:00')
);

A UNIQUE INDEX must include all columns in the table's partitioning function

パーティショニングするテーブルに一意キー(unique key)のあるカラムがある場合は、そのカラムをパーティショニングに使うカラムに含めないといけないらしい。
なるほど、データ更新するときにユニークか判断するため、折角パーティションで分けたテーブルを全て見に行かないと行けないし、当たり前か。
サンプルでは(A)のnameカラムに一意キーを設定しているため、このエラーが発生する。

一意キーを解除
DROP INDEX name ON categories;

Foreign keys are not yet supported in conjunction with partitioning

外部キー(foregin key)制約がついているとパーティショニングは使えないらしい。
これは親テーブルでも、子テーブルでも適用される。
サンプルでは(A)でも(B)でもこのエラーが発生する。

外部キー制約を解除
ALTER TABLE posts DROP FOREIGN KEY posts_ibfk_1;

A PRIMARY KEY must include all columns in the table's partitioning function

パーティショニングに使うカラムは、主キー(primary key)に含まれていないといけないらしい。
サンプルでは(B)の主キーはidのみだけど、パーティショニングにcreated_atを利用しているため、このエラーが発生する。

主キーにcreated_atを追加
ALTER TABLE posts DROP PRIMARY KEY, ADD PRIMARY KEY(id, created_at);

公式サイト

3
0
1

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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?