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


19.5パティション選択

MySQL 5.6は,ステ,トメントを実行するときに,指定された在哪里条件と一致する行をチェックすべきパーティションおよびサブパーティションの明示的選択をサポートします。パティション選択は、特定のパーティションのみで一致がチェックされる点でパーティションプルーニングと似ていますが、2 つの重要な点で異なります。

  1. チェックされるパーティションは,パーティションプルーニングと異なり(自動),ステートメントの発行者が指定します。

  2. パーティションプルーニングはクエリーのみに適用されますが,明示的なパーティション選択はクエリーおよびいくつかのDMLステートメントの両方でサポートされます。

明示的なパティション選択をサポトするSQLステトメントを次に一覧します。

  • 选择

  • 删除

  • 插入

  • 取代

  • 更新

  • 加载数据

  • 加载XML

このセクションの残りの部分では,上記に一覧したステートメントに一般的に適用される明示的パーティション選択について説明し,いくつかの例を示します。

明示的パティション選択は,分区オプションを使用して実装されます。サポトされるすべてのステトメントにいて,このオプションは次のような構文を使用します。

分区(partition_namespartition_namespartition_name,……

このオプションは常に,パティションが属するテブルの名前の後ろに続けます。partition_namesは,使用されるパティションまたはサブパティションのカンマ区切りのリストです。このリスト内の各名前は,指定されたテーブルの既存のパーティションまたはサブパーティションの名前である必要があります。パティションまたはサブパティションが見(分区的partition_name并不存在で失敗します。partition_namesに指定するパーティションまたはサブパーティションは,任意の順序でリストでき,重複していてもかまいません。

分区オプションを使用すると,リストされたパーティションおよびサブパーティションのみで一致する行がチェックされます。このオプションを选择ステトメントで使用すると,指定したパティションに属する行を判別できます。次のようなステトメントを使用して作成および移入された,员工という名前のパティション化されたテブルがあるとします。

设置@@sql_mode = ";CREATE TABLE employees (id INT NOT NULL AUTO_INCREMENT主键,fname VARCHAR(25) NOT NULL, lname VARCHAR(25) NOT NULL, store_id INT NOT NULL, department_id INT NOT NULL)分区范围(id)(分区p0值小于(5),分区p1值小于(10),分区p2值小于(15),分区p3值小于MAXVALUE);插入员工价值观(”,“鲍勃”,“泰勒”,3、2),(“,“弗兰克”,威廉姆斯,1,2),(“、“艾伦”、“约翰逊”,3,4),(“,“吉姆”,“史密斯”,2、4),(“,“玛丽”,琼斯,1,1),(“,“琳达”,“黑”,2、3),(“、“Ed”、“琼斯”,2、1),(“、“6”、“威尔逊”,3,1),(“、“安迪”、“史密斯”,1,3),(“,“卢”,“水”,2、4),(“、“吉尔”、“石头”,1、4),(“,“罗杰”,“白色”,3、2),(“、“霍华德”、“安德鲁”,1,2),(“、“弗雷德”、“戈德堡”3,3),(“,“芭芭拉”,“布朗”,2、3),(“,“爱丽丝”,罗杰斯的2 2),(“,“马克”,“摩根”,3、3),(“、“凯伦”、“科尔”3,2);

どの行がパティションp1に格納されているかは次のように確認できます。

mysql> SELECT * FROM employees (p1);+----+-------+--------+----------+---------------+ | id |帧| lname | store_id | department_id  | +----+-------+--------+----------+---------------+ | 5玛丽琼斯| | | 1 | 1 | | 6 |黑色琳达| | 2 | 3 | | 7 Ed琼斯| | | 2 | 1 | | 6月8日| |威尔逊| 3 | 1 | | | 9安迪史密斯| | 1 | 3  | +----+-------+--------+----------+---------------+ 5行集(0.00秒)

この結果は,クエリ从id在5到9之间的雇员中选择*によって取得されるものと同じです。

複数のパティションからの行を取得するには,それらの名前をカンマ区切りのリストとして指定します。たとえば,SELECT * FROM employees PARTITION (p1, p2)はパティションp1およびp2からのすべての行を返し,残りのパティションからの行を除外します。

パティション化されたテブルに対する有効なクエリは,分区オプションを使用して,結果を1つ以上の目的のパーティションに制限するように書き直すことができます。在哪里条件、命令オプション,限制オプションなどを使用できます。集約関数をおよび集团オプション付きで使用することもできます。次の各クエリは,前に定義した员工テブルで実行するときに,有効な結果を生成します。

mysql> SELECT * FROM employees PARTITION (p0, p2) -> WHERE lname LIKE 'S%';+----+-------+-------+----------+---------------+ | id |帧| lname | store_id | department_id  | +----+-------+-------+----------+---------------+ | 4史密斯吉姆| | | 2 | 4 | | 11吉尔石头| | 1 | 4 |  | +----+-------+-------+----------+---------------+ 2行(0.00秒)mysql >选择id, CONCAT(帧、“lname)从员工分区名称- > (p0) ORDER BY lname;+----+----------------+ | id |名称  | +----+----------------+ | 3 |埃伦·约翰逊| | 4 |吉姆史密斯| | 1 |鲍勃·泰勒| | 2 |弗兰克·威廉姆斯  | +----+----------------+ 4行集(0.06秒)mysql >选择store_id,计数(department_id) c - >从员工分区(p1, p2, p3) - > GROUP BY store_id c > 4;+---+----------+ | c | store_id  | +---+----------+ | 5 | 2 | | 5 | 3  | +---+----------+ 2行集(0.00秒)

パーティション選択を使用するステートメントは,MySQL 5.6でサポートされるパーティショニングタイプを使用するテーブルで使用できます。テブルが(线性)散列または(线性)的关键パーティショニングを使用して作成されているけれども,パーティションの名前が指定されていない場合は,MySQLはパーティションにp0p1p2、...、pn - 1という名前を自動的に付けます。ここで,Nはパティションの数です。明示的に名前が付けられていないサブパティションの場合,MySQLは各パティションpX内のサブパティションにpXsp0pXsp1pXsp2、...、pXspm - 1という名前を自動的に割り当てます。ここで,はサブパティションの数です。このテブルで选择(または明示的パーティション選択が許可されるほかのSQLステートメント)を実行するときは,次のようにこれらの生成された名前を分区オプションで使用できます。

mysql >创建表employees_sub (- > id INT NOT NULL AUTO_INCREMENT >帧VARCHAR(25)不是NULL,——> lname VARCHAR(25)不是NULL,——> store_id INT NOT NULL,——> department_id INT NOT NULL, pk - >主键(id、lname ) -> ) -> 分区范围(id) - > SUBPARTITION通过键(lname) - > SUBPARTITIONS 2(- >分区p0值小于(5),- - - - - - >分区p1值小于(10),- - - - - - >分区p2值小于(15),- - - - - - >分区p3值小于MAXVALUE - >);查询OK, 0 rows affected (1.14 sec) mysql> INSERT INTO employees_sub # reuse data in employees table -> SELECT * FROM employees;查询OK, 18 rows affected (0.09 sec) Records: 18 duplicate: 0 Warnings: 0 mysql> SELECT id, CONCAT(fname, ' ', lname) AS name -> FROM employees_sub PARTITION (p2sp1);+----+---------------+ | id |名称  | +----+---------------+ | 10 |卢水| | | 14弗雷德戈德堡  | +----+---------------+ 2行集(0.00秒)

次のように分区オプションを插入……选择ステトメントの选择部分に使用することもできます。

CREATE TABLE employees_copy LIKE employees;查询OK, 0 rows affected (0.28 sec) mysql> INSERT INTO employees_copy -> SELECT * FROM employees PARTITION (p2);查询OK, 5 rows affected (0.04 sec) Records: 5 duplicate: 0 Warnings: 0 mysql> SELECT * FROM employees_copy;+----+--------+----------+----------+---------------+ | id |帧| lname | store_id | department_id  | +----+--------+----------+----------+---------------+ | 10 |卢水| | 2 | 4 | | 11 |吉尔石头| | 1 | 4 | | | 12罗杰白色| | 3 | 2 | | 13霍华德| |安德鲁斯| 1 | 2 | | | 14弗雷德·戈德堡| | 3 | 3  | +----+--------+----------+----------+---------------+ 5行集(0.00秒)

パティション選択は結合と一緒に使用することもできます。次のステトメントを使用して2のテブルを作成して移入するとします。

CREATE TABLE stores (id INT NOT NULL AUTO_INCREMENT主键,城市VARCHAR(30) NOT NULL)(“,”Nambucca插入存储值 '), ('', ' Uranga '), ('', ' Bellingen '), ('', ' 格拉夫顿”);创建表部门(id INT NOT NULL AUTO_INCREMENT主键,名称VARCHAR(30) NOT NULL)分区INSERT INTO department VALUES (", 'Sales'), (", 'Customer Service'), (", 'Delivery'), (", 'Accounting');

任意またはすべてのテーブルからのパーティション(またはサブパーティション,あるいはその両方)を結合で明示的に選択できます(指定されたテーブルからのパーティションを選択するために使用する分区オプションは,テーブル名の直後,かつほかのすべてのオプション(テーブルエイリアスを含む)の前に指定します)。たとえば、次のクエリは都市南布卡および贝林根(商店テブルのパティションp0)のいずれかの店舗の販売部門または配送部門(部门テブルのパティションp1)で働いているすべての従業員の,名前,従業員id,部門,および都市を取得します。

mysql> SELECT -> e. ID AS 'Employee ID',fname, ' ', e.lname) AS Name, -> s. City AS City, d.name AS department -> FROM employees AS e -> JOIN stores PARTITION (p1) AS s ON e.store_id=s. lname。id -> JOIN departments PARTITION (p0) AS d ON e.d department_id= d.d -> ORDER BY e.lname;+-------------+---------------+-----------+------------+ | 雇员ID | | |城市部门名称  | +-------------+---------------+-----------+------------+ | 14 |弗雷德·戈德堡| Bellingen交付| | | 5 |玛丽琼斯| Nambucca |销售| | 17 | | Morgan Bellingen交付| | | 9 Andy Smith | | Nambucca交付| | | 6月8日| |威尔逊Bellingen |销售  | +-------------+---------------+-----------+------------+ 5行集(0.00秒)

MySQLでの結合の一般情報にいては,セクション13.2.9.2 " join構文"を参照してください。

删除ステトメントで分区オプションを使用すると,オプションにリストされているパーティション(およびサブパーティション(ある場合))でのみ削除される行がチェックされます。次のようにほかのパティションは無視されます。

SELECT * FROM employees WHERE fname LIKE 'j%';+----+-------+--------+----------+---------------+ | id |帧| lname | store_id | department_id  | +----+-------+--------+----------+---------------+ | 4史密斯吉姆| | | 2 | 4 | | | | 6月8威尔逊| 3 | 1 | | 11吉尔石头| | 1 | 4 |  | +----+-------+--------+----------+---------------+ 3行集(0.00秒)mysql >删除从员工分区(p0, p1) - >在帧像“j %”;查询OK, 2行影响(0.09秒)mysql> SELECT * FROM employees WHERE fname LIKE 'j%';+----+-------+-------+----------+---------------+ | id |帧| lname | store_id | department_id  | +----+-------+-------+----------+---------------+ | 11吉尔石头| | 1 | 4 |  | +----+-------+-------+----------+---------------+ 1行集(0.00秒)

在哪里条件と一致するパティションp0およびp1内の2の行のみが削除されました。选择を2回目に実行したときの結果から確認できるように,在哪里条件に一致する1行がテブルに残っていますが,別のパティション(p2にあります。

明示的パティション選択を使用する更新ステトメントも同様に動作します。次のステトメントを実行することによって確認できるように,分区オプションによって参照されるパティション内の行のみが,更新される行を判別するときに考慮されます。

mysql> UPDATE employees PARTITION (p0) SET store_id = 2 WHERE fname = 'Jill';查询OK, 0 rows affected (0.00 sec) rows matched: 0 Changed: 0 Warnings: 0 mysql> SELECT * FROM employees WHERE fname = 'Jill';+----+-------+-------+----------+---------------+ | id |帧| lname | store_id | department_id  | +----+-------+-------+----------+---------------+ | 11吉尔石头| | 1 | 4 |  | +----+-------+-------+----------+---------------+ 1行组(0.00秒)mysql >更新员工分区(p2) - >设置store_id = 2帧=“吉尔”;查询OK, 1 row affected (0.09 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM employees WHERE fname = 'Jill';+----+-------+-------+----------+---------------+ | id |帧| lname | store_id | department_id  | +----+-------+-------+----------+---------------+ | 11吉尔石头| | 2 | 4 |  | +----+-------+-------+----------+---------------+ 1行集(0.00秒)

同様に,删除付きで分区を使用すると,パティションリストに指定されたパティション内の行のみが削除をチェックされます。

行を挿入するステートメントの動作は,適切なパーティションが見つからないとステートメントが失敗する点が異なります。これは,次のように插入および取代ステトメントの両方に当てはまります。

mysql> INSERT INTO employees PARTITION (p2) VALUES (20, 'Jan', 'Jones', 1,3);mysql> INSERT INTO employees partition (p3) VALUES (20, 'Jan', 'Jones', 1,3);查询OK, 1 row affected (0.07 sec) mysql> REPLACE INTO employees PARTITION (p0) VALUES (20, 'Jan', 'Jones', 3,2);错误1729 (HY000):发现一行不匹配给定的分区集mysql> REPLACE INTO employees partition (p3) VALUES (20, 'Jan', 'Jones', 3,2);查询OK, 2行受影响(0.09秒)

InnoDBストレージエンジンを使用するパーティション化されたテーブルに複数の行を書き込むステートメントの場合,に続くリスト内の行をpartition_namesリストに指定されたパーティションのいずれかに書き込むことができないときは,ステートメント全体が失敗し,一行も書き込まれません。これにいては,次の例(员工テブルを再使用)の插入ステトメントで示されています。

-> PARTITION p4 VALUES LESS THAN (25), -> PARTITION p5 VALUES LESS THAN MAXVALUE ->);查询OK, 6 rows affected (2.09 sec) Records: 6 duplicate: 0 Warnings: 0 mysql> SHOW CREATE TABLE employees\G *************************** 1。row *************************** Table: employees Create Table: Create Table ' employees ' (' id ' int(11) NOT NULL AUTO_INCREMENT, ' fname ' varchar(25) NOT NULL, ' lname ' varchar(25) NOT NULL, ' store_id ' int(11) NOT NULL, ' department_id ' int(11) NOT NULL, PRIMARY KEY (' id ')) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=latin1 /*!50100分区范围(id)(分区p0值小于(5)引擎= InnoDB分区p1值小于(10)引擎= InnoDB分区p2值小于(15)引擎= InnoDB分区p3值小于(20)引擎= InnoDB分区p4值小于(25)引擎= InnoDB分区p5值小于MAXVALUE引擎= InnoDB) * / 1行组(0.00秒)mysql >插入员工分区(p3, p4)值- >(24岁的蒂姆,“格林”,3,1),(26岁,“琳达”,“工厂”,2,1);错误1729 (HY000):发现一行不匹配给定的分区集mysql> INSERT INTO employees partition (p3, p4)。p5)值- >(24岁的蒂姆,“格林”,3,1),(26岁,“琳达”,“工厂”,2,1);查询OK, 2行受影响(0.06秒)记录:2重复:0警告:0

前述のことは,複数の行を書き込む插入および取代ステトメントの両方に当てはまります。

MySQL 5.6.10以降では,自動パ,ティショニングを提供するストレ,ジエンジン(NDBなど)を使用するテブルの場合,パティション選択は無効になります。(Bug #14827952)