10bet网址
MySQL 5.6リファレンスマニュアル
下载本手册
PDF(美国Ltr)- 26.8 mb
PDF (A4)- 26.8 mb


19.3.1 rangeおよびlistパティションの管理

范围および列表パーティションは,パーティションの追加と削除がどのように処理されるかに関してはよく似ています。このため,このセクションでは両方のタ。ハッシュまたはキによってパティション化されたテブルの管理にセクション19.3.2 " hashおよびkeyパティションの管理"を参照してください。范围または列表パティションの削除は追加よりも単純なので,これを最初に説明します。

范围または列表によってパティション化されたテブルからパティションを削除する操作は,删除分区句付きでALTER TABLEステトメントを使用することで実行できます。非常に基本的な例ですが,次の创建表および插入ステートメントを使用して,範囲によってパーティション化されるテーブルをすでに作成済みで,10件のレコードを移入しているとします。

mysql> CREATE TABLE tr (id INT, name VARCHAR(50), bought DATE) -> PARTITION BY RANGE(YEAR(bought)) (-> PARTITION p0 VALUES小于(1990),-> PARTITION p1 VALUES小于(1995),-> PARTITION p2 VALUES小于(2000),-> PARTITION p3 VALUES小于(2005)->);查询好,0行影响(0.01秒)mysql >插入tr值- >(1台组织者的' 2003-10-15 '),- - - - - - > (2,CD播放器,' 1993-11-05 '),- - - - - - >(3,“电视机”,“1996-03-10”),- - - - - - >(4,“书架”,“1982-01-10”),- - - - - - >(5“健身自行车”,“2004-05-09”),- - - - - - >(6,“沙发”,“1987-06-05”),- - - - - - >(7,“爆米花机”,“2001-11-22”),- - - - - - >(8,“水族馆”,“1992-08-04”),- - - - - - >(9日学习的桌子,“1984-09-16”),- - - - - - >(10,熔岩灯,' 1998-12-25 ');查询OK, 10行受影响(0.01秒)

パティションp2に挿入されているはずの項目を以下のように確認できます。

mysql> SELECT * FROM > WHERE bought BETWEEN '1995-01-01' AND '1999-12-31';+------+-----------+------------+ | id |名称|购买  | +------+-----------+------------+ | 电视机3 | | 1996-03-10 | | 10 |熔岩灯| 1998-12-25  | +------+-----------+------------+ 2行集(0.00秒)

p2という名前のパティションを削除するには,次のコマンドを実行します。

删除分区查询OK, 0行受影响(0.03秒)
注記

NDBストレジエンジンは修改表…删除分区をサポトしません。ただし,この章で説明されているALTER TABLEへのほかのパティショニング関連拡張はサポトしています。

パティションを削除すると,そのパタも削除されることを覚えておくことは非常に重要です。前の选择クエリを再実行することで,これが本当であることを確認できます。

mysql> SELECT * FROM WHERE bought -> BETWEEN '1995-01-01' AND '1999-12-31';空集(0.00秒)

このため,テブルに対して修改表…删除分区を実行するには,そのテブルの下降権限が必要です。

テーブル定義およびそのパーティショニングスキームを保持したまま,すべてのパーティションからすべてのデータを削除する場合は,截断表ステトメントを使用してください。(セクション13.1.33 " truncate table構文"を参照してください)。

デタを失うことなくテブルのパティショニングを変更する場合は,代わりに修改表…重组分区を使用してください。重组分区にいては,後続の説明またはセクション13.1.7 " alter table構文"を参照してください。

ここで显示创建表ステートメントを実行すると,テーブルのパーティショニング構成がどのように変更されたかを確認できます。

mysql >显示创建表tr \ G  *************************** 1。行***************************表:tr创建表:Create表' tr ' (' id ' int(11) default NULL, ' name ' varchar(50) default NULL, ' purchased ' date default NULL) ENGINE=MyISAM default CHARSET=latin1 PARTITION BY RANGE (YEAR(purchased)) (PARTITION p0 VALUES小于(1990)ENGINE=MyISAM, PARTITION p1 VALUES小于(1995)ENGINE=MyISAM, PARTITION p3 VALUES小于(2005)ENGINE=MyISAM) 1行在set(0.01秒)

购买カラム値が“1995-01-01”から“2004-12-31”まで(両端を含む)の新しい行を変更済みテブルに挿入すると,それらの行はパティションp3に格納されます。このことを次のようにして確認できます。

mysql> INSERT INTO tr VALUES (11, 'pencil holder', '1995-07-12');查询OK, 1 row affected (0.00 sec) mysql> SELECT * FROM tr WHERE bought -> BETWEEN '1995-01-01' AND '2004-12-31';+------+----------------+------------+ | id |名称|购买  | +------+----------------+------------+ | 11 |铅笔持有人| 1995-07-12 | | 1 |桌子组织者| 2003-10-15 | | 5 |健身自行车| 2004-05-09 | | 7爆米花机| | 2001-11-22  | +------+----------------+------------+ 4行集(0.00秒)mysql > ALTER TABLE tr分区p3下降;查询OK, 0 rows affected (0.03 sec) mysql> SELECT * FROM tr WHERE bought -> BETWEEN '1995-01-01' AND '2004-12-31';空集(0.00秒)

修改表…删除分区の結果としてテブルから削除された行数は,同等の删除クエリとは異なり,サから報告されません。

列表パティションを削除する場合は,范围パティションの削除に使用するものとまったく同じ修改表…删除分区構文を使用します。ただし,この操作が持つ影響について、このテーブルをあとで使用する際に重要な違いが 1 つあります。このテーブルには、削除したパーティションを定義する値リストに含まれていた値を持つ行を挿入できなくなります。(例については、セクション19.2.2 " listパティショニング"を参照してください)。

すでにパティション化されたテブルに新しい範囲またはリストパティションを追加するには,修改表…添加分区ステトメントを使用します。范围によってパーティション化されたテーブルの場合は,これを使用して,既存のパーティションのリストの最後に新しい範囲を追加できます。次のように定義された,組織のメンバーシップデータが含まれるパーティション化されたテーブルがあるとします。

CREATE TABLE成员(id INT, fname VARCHAR(25), lname VARCHAR(25), dob DATE) PARTITION BY RANGE(YEAR(dob))(分区p0值小于(1970),分区p1值小于(1980),分区p2值小于(1990));

さらに,メンバの最少年齢は16歳であるとします。2005年カレンダーがの終わりに近づいて,1990年に生まれたメンバー(さらに,来年以降はそれよりあとのメンバー)をまもなく受け入れることに気付きます。次のように成员テーブルを変更することで,1990年から1999年までに生まれた新しいメンバーを受け入れることができます。

添加分区(分区p3值小于(2000))

範囲によってパティション化されたテブルで添加分区を使用するときは,パティションリストの上端にのみ新しいパティションを追加できます。この方法で新しいパーティションを既存のパーティションの間または前に追加しようとすると,次のようにエラーになります。

mysql> ALTER TABLE member > ADD PARTITION (> PARTITION n VALUES小于(1960));错误1463 (HY000): VALUES小于value必须严格»增加每个分区

この問題は,次のように最初のパーティションを2つに再編成し,それらの間の範囲を分割することで回避できます。

将分区p0重组为分区n0值小于(1960),分区n1值小于(1970);

显示创建表を使用することで,ALTER TABLEステトメントによって意図した効果が得られたことを確認できます。

mysql >显示创建表成员\ G  *************************** 1。row *************************** Table: members Create Table: Create Table ' members ' (' id ' int(11) DEFAULT NULL, ' fname ' varchar(25) DEFAULT NULL, ' lname ' varchar(25) DEFAULT NULL, ' dob ' date DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!50100分区范围(年(dob))(分区n0值小于(1960)引擎= InnoDB,分区n1值小于(1970)引擎= InnoDB,分区p1值小于(1980)引擎= InnoDB,分区p2值小于(1990)引擎= InnoDB,分区p3值小于(2000)引擎= InnoDB) */ 1 row in set (0.00 sec)

セクション13.1.7.1 " alter tableパティション操作"も参照してください。

修改表…添加分区を使用して,列表によってパティション化されたテブルに新しいパティションを追加することもできます。次の创建表ステトメントを使用してテブルttが定義されているとします。

CREATE TABLE tt (id INT, data INT) PARTITION BY LIST(data) (PARTITION p0 VALUES IN (5,10,15), PARTITION p1 VALUES IN (6,12,18));

数据カラム値が714,および21である行を格納する新しいパティションを次のように追加できます。

ALTER TABLE tt ADD PARTITION (PARTITION p2 VALUES IN (7,14,21));

既存のパティションの値リストにすでに含まれている値を含む新しい列表パティションは,追加できません。これを試みるとエラになります。

mysql> ALTER TABLE tt ADD PARTITION > (PARTITION np VALUES IN (4,8,12));错误1465 (HY000):在列表分区中相同的常量有多个定义

数据カラム値が12である行がパティションp1にすでに割り当てられているため,値リストに12が含まれる新しいパティションをテブルttに作成することはできません。これを実現するために,p1を削除し,npを追加してから,定義を変更した新しいp1を追加できます。ただし,すでに説明したように、これによってp1に格納されていたすべてのデタが失われるので,これが実際にやりたいことでないことが多いです。別の解決策になる可能性があるのが,创建表…选择……を使用して,新しいパーティショニング付きでテーブルのコピーを作成し,データをそこにコピーしてから,古いテーブルを削除して新しいテーブルを名前変更することですが,これは大量のデータを扱うときに非常に時間がかかる可能性があります。高可用性が要求される状況では実行できない可能性もあります。

次のように単一修改表…添加分区ステトメントで複数のパティションを追加できます。

CREATE TABLE employees (id INT NOT NULL, fname VARCHAR(50) NOT NULL, lname VARCHAR(50) NOT NULL, hired DATE NOT NULL)分区范围(YEAR(hired))(分区p1值小于(1991),分区p2值小于(1996),分区p3值小于(2001),分区p4值小于(2005));增加分区(p5分区值小于(2010),p6分区值小于MAXVALUE);

ありがたいことにMySQLのパーティショニング実装は,データを失うことなくパーティショニングを再定義する方法を提供しています。まず,范围パティショニングを使用するいくかの簡単な例を見てみましょう。次のように定義された成员テブルを思い出してください。

mysql >显示创建表成员\ G  *************************** 1。row *************************** Table: members Create Table: Create Table ' members ' (' id ' int(11) default NULL, ' fname ' varchar(25) default NULL, ' lname ' varchar(25) default NULL, ' dob ' date default NULL) ENGINE=MyISAM default CHARSET=latin1 PARTITION BY RANGE (YEAR(dob)) (PARTITION p0 VALUES小于(1970)ENGINE=MyISAM, PARTITION p1 VALUES小于(1980)ENGINE=MyISAM, PARTITION p2 VALUES小于(1990)ENGINE=MyISAM。分区p3值小于(2000)引擎= MyISAM

1960年より前に生まれたメンバを表すすべての行を別のパティションに移動するとします。すでに説明したように,これは修改表…添加分区を使用して行うことはできません。ただし,ALTER TABLEへの別のパティション関連拡張を使用して,これを行うことができます。

将分区p0重组为分区s0值小于(1960),分区s1值小于(1970);

実際には,このコマンドはパティションp0を2の新しいパティションs0およびs1に分割します。さらに,p0に格納されていたデタを2の分区…值……句に示されているルルに従って新しいパティションに移動する結果,s0には(捐赠)が1960より小さいレコドのみが含まれ,s1には(捐赠)が1960以上で1970より小さい行が含まれます。

重组分区句を使用して,隣接するパティションをマジすることもできます。次のように成员テブルを以前のパティショニングに戻すことができます。

将分区s0、s1重组为分区p0值小于(1970);

重组分区を使用してパティションを分割またはマジしてもデタは失われません。上記のステトメントを実行すると,MySQLはパティションs0およびs1に格納されていたすべてのレコドをパティションp0に移動します。

重组分区の一般的な構文を次に示します。

ALTER TABLEtbl_name重组分区partition_list到(partition_definitions);

ここで,tbl_nameはパティション化されたテブルの名前,partition_listは変更する1以上の既存のパティションの名前のカンマ区切りのリストです。partition_definitionsは,创建表で使用されるpartition_definitionsリスト(セクション13.1.17 " create table構文"を参照してください)と同じ規則に従う,新しいパ,ティション定義のカンマ区切りのリストです。重组分区を使用するときは,複数のパーティションを1つにマージする,または1つのパーティションを多数に分割する以外のこともできます。たとえば,次のように成员テブルの4のパティションすべてを2に再編成できます。

将分区p0,p1,p2,p3重组为分区m0值小于(1980),分区m1值小于(2000);

列表によってパティション化されたテブルで重组分区を使用することもできます。リストによってパティション化されたttテーブルに新しいパーティションを追加する操作が,既存のパーティションのいずれかの値リストにすでに存在する値が新しいパーティションに含まれていることが原因で失敗する問題に戻ります。これは,競合しない値のみが含まれるパーティションを追加してから,新しいパーティションと既存のものを再編成して既存のものに格納されていた値が新しいものに移動するようにすることで,対処できます。

ALTER TABLE tt ADD PARTITION (PARTITION np VALUES IN (4,8));重组分区p1,np INTO (PARTITION p1 VALUES IN (6,18), PARTITION np VALUES IN (4,8,12));

范围または列表によってパティション化されたテブルをパティション化し直すために修改表…重组分区を使用するときに注意すべき,いくかの重要点を次に示します。

  • 新しいパティショニングスキムを決定するために使用される分区句には,创建表ステトメントで使用されるものと同じ規則が適用されます。

    もっとも重要なことは,新しいパティショニングスキ,ムには,重複する範囲(范围によってパティション化されたテブルに適用される)または値のセット(列表によってパティション化されたテブルを再編成するとき)を指定できないことを覚えておくべきです。

  • partition_definitionsリストのパティションの組み合わせは,partition_listに指定されたパティションの組み合わせの範囲または値セット全体と同じであるべきです。

    たとえば,このセクションの例として使用されている成员テブルでは,パティションp1およびp2が1980年から1999年までを範囲としています。このため,これら2。

  • 范围によってパティション化されたテブルの場合は,隣接するパティションのみを再編成できます。範囲パティションを飛ばすことはできません。

    たとえば,このセクションの例として使用されている成员テブルを,将分区p0,p2重组为…で始まるステトメントを使用して再編成することはできません。p0は1970年より前の年を範囲とし,p21990年はから1999年まで(両端を含む)を範囲としていて,この2つは隣接するパーティションではないためです。

  • 重组分区を使用して,テ。まり,たとえば,范围パティションを哈希パティションに変更することはできません(逆も不可)。このコマンドを使用してパティショニング式またはカラムを変更することもできません。これらの作業をテブルを削除および再作成することなく実現するために,修改表…除以…を使用できます。例:

    用HASH(YEAR(dob))修改表成员分区