范围および列表パーティションは,パーティションの追加と削除がどのように処理されるかに関してはよく似ています。このため,このセクションでは両方のタ。ハッシュまたはキによってパティション化されたテブルの管理にセクション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));
数据
カラム値が7
、14
,および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年より前の年を範囲とし,p2
1990年はから1999年まで(両端を含む)を範囲としていて,この2つは隣接するパーティションではないためです。重组分区
を使用して,テ。まり,たとえば,范围
パティションを哈希
パティションに変更することはできません(逆も不可)。このコマンドを使用してパティショニング式またはカラムを変更することもできません。これらの作業をテブルを削除および再作成することなく実現するために,修改表…除以…
を使用できます。例:用HASH(YEAR(dob))修改表成员分区