2017-09-12 4 views
0

私は約2Mlnのレコードを持つ大きなテーブルを持っていました。MySQLのパーティション化 - プライマリキーとユニークレコードによるエラー

私はID列をPRIMARY AUTO_INCREMENT intとしています(常にUNIQUEでなければなりません)。 私は "itear" int(4)の列を持っており、2016年から2050年までにBY RANGEを分割したいのです。ほとんどのQueryではWHERE文を1年ごとに使用しているためです。

パーティションを作成すると、 "theyear"キーがPRIMARY KEYである必要があるというエラーが表示されるので、複数列のキーPRIMARY(id、theyear)を実行するプライマリキーを編集しました。

それはすべてOKですが、私の「ID」列に、それはあまりにも「theyear」列をチェックするので、私は挿入するのであれば...、もう UNIQUEではありません。

INSERT INTO table (id, theyear) VALUES (1, 2016); 
INSERT INTO table (id, theyear) VALUES (1, 2017); 

それはNO ERRORを言わない、ので、 UNIQUEはidとtheyearの両方をチェックします。

「id」列でUNIQUEを失うことなくパーティション化を実装する方法はありますか?

ありがとうございました。

+0

年に対して別の 'unique'制約を追加しようとしましたか? – cwallenpoole

+0

私はこれをドキュメント(https://dev.mysql.com/doc/refman/5.7/en/partitioning-range.html)に基づいていますが、あなたの主キーを変更する必要はありません。 RANGEパーティション彼らが使用するすべての例には、PRIMARY KEYはありません。何か不足していますか?間違ってKEY()で分割しようとしていますか? –

+0

なぜパーティションを作成しますか?どんなクエリがより速く実行されると思いますか?そのクエリと 'SHOW CREATE TABLE'を提供してください。私はおそらく、適切なインデックスがパーティション化より高速か高速かと主張するでしょう。おそらくインデックスはYEARで始まるでしょう。ヒント:http://mysql.rjweb.org/doc.php/partitionmaint –

答えて

0

クエリにはtheyearが使用されるため、RANGEを使用してパーティションを作成すると、適切なINDEXを使用して大量のデータが得られます。

は、例えば、キー

INDEX IDX_theyear(theyear) 

PARTITION BY RANGE (theyear) ( 
PARTITION p0 VALUES LESS THAN (2017), 
PARTITION p1 VALUES LESS THAN (2018), 
PARTITION p2 VALUES LESS THAN (2019), 
PARTITION p3 VALUES LESS THAN (2020) 

既存のプライマリを維持し、KEY() partitionningを使用しないでください。後でパーティションを追加することはできますが、もっと難しくなります。あなたのデータが古い場合は、明らかに古い年から始まる

+0

"#1503 - PRIMARY KEYには、テーブルのパーティショニングにすべての列を含める必要があります(たとえば、THAN(2020))。私が質問で言ったように "機能" –

+0

完全なテーブル作成コードを貼り付けても構いませんか? –

関連する問題