Char列に基づいてMySQLテーブルを分割する方法は?
-
04-10-2019 - |
質問
Char列に基づいてパーティションをかけることは可能ですか?
MySQL 5.1ドキュメントを確認した後、整数型のみを使用できるように見えます。
これは正しいです?または、何らかの関数を使用してCHARを整数に変換できますか?
問題のCHARフィールドには、一意の識別子が含まれています。
解決
MySQL 5.1でのパーティション化は、整数列を扱うことができます(ソース)。あなたはaのみを使用することができます パーティション機能はほとんどありません 非整数列で。例えば:
CREATE TABLE ti (id INT, amount DECIMAL(7,2), tr_date DATE)
ENGINE=INNODB
PARTITION BY HASH( MONTH(tr_date) )
PARTITIONS 6;
使用することもできます キーパーティション MySQL 5.1では、プライマリキーにテーブルのパーティション機能のすべての列が含まれている限り:
CREATE TABLE k1 (
id CHAR(3) NOT NULL PRIMARY KEY,
value int
)
PARTITION BY KEY(id)
PARTITIONS 10;
一方、MySQL 5.5では、使用できます 範囲列パーティション また 列のパーティション化をリストします 文字ベースの列を含むさまざまなデータ型で。
リスト列の例:
CREATE TABLE expenses (
expense_date DATE NOT NULL,
category VARCHAR(30),
amount DECIMAL (10,3)
);
ALTER TABLE expenses
PARTITION BY LIST COLUMNS (category)
(
PARTITION p01 VALUES IN ('lodging', 'food'),
PARTITION p02 VALUES IN ('flights', 'ground transportation'),
PARTITION p03 VALUES IN ('leisure', 'customer entertainment'),
PARTITION p04 VALUES IN ('communications'),
PARTITION p05 VALUES IN ('fees')
);
範囲列の例:
CREATE TABLE range_test (
code CHAR(3),
value INT
)
PARTITION BY RANGE COLUMNS(code) (
PARTITION p0 VALUES LESS THAN ('MMM'),
PARTITION p1 VALUES LESS THAN ('ZZZ')
);
参考文献:
他のヒント
パーティションをかけて何を得たいと思っていますか?ハッシュとリストがパフォーマンスの向上を提供する可能性は低いです。 100万列未満のテーブルを分割することはめったに役立ちません。
分割に関するその他のコメント: http://mysql.rjweb.org/doc.php/partitionmaint
5.6と5.7がリラックスしています いくつかの 他の回答で言及されている制限のうち、まだパーティション化がインデックス作成よりも優れていることはめったにありません。
所属していません StackOverflow