19.5 Partition Selection 分区查询

19.5 Partition Selection

MySQL 5.6 支持显示的查询分区和子分区,当执行一个语句, 应该坚持给定的where条件匹配的行。 分区查询类似于分区裁剪,

在特定的分区中检查匹配,但在2个关键方面不同:

1.被检查的分区是指定通过执行语句,不像分区裁剪,这是自动的。

  1. 而分区裁剪只能用于查询,显示查询分区是查询和DML语句都支持

SQL语句支持显式分区查询如下:

SELECT

DELETE

INSERT

REPLACE

UPDATE

LOAD DATA.

LOAD XML.

本节的其余部分讨论显示的分区查询,因为它通常应用于查询,提供一些例子:

显示的分区查询 是实现使用分区选项, 对于所有的支持的语句:

PARTITION (partition_names)

  partition_names:
      partition_name, ...

此选项总是遵循 表的名字(分区所属的表), partition_names 是一个逗号分隔的分区列表。

当分区选项被使用, 只有列出的分区或者子分区会被检索用于匹配的行。这个选项可以用于SELECT 语句,来确定哪些行属于给定的分区。

考虑一个名为雇员的分区表, 创建和填充使用语句如下:

SET @@SQL_MODE = ”;

CREATE TABLE employees (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
fname VARCHAR(25) NOT NULL,
lname VARCHAR(25) NOT NULL,
store_id INT NOT NULL,
department_id INT NOT NULL
)
PARTITION BY RANGE(id) (
PARTITION p0 VALUES LESS THAN (5),
PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (15),
PARTITION p3 VALUES LESS THAN MAXVALUE
);

INSERT INTO employees VALUES
(”, ‘Bob’, ‘Taylor’, 3, 2), (”, ‘Frank’, ‘Williams’, 1, 2),
(”, ‘Ellen’, ‘Johnson’, 3, 4), (”, ‘Jim’, ‘Smith’, 2, 4),
(”, ‘Mary’, ‘Jones’, 1, 1), (”, ‘Linda’, ‘Black’, 2, 3),
(”, ‘Ed’, ‘Jones’, 2, 1), (”, ‘June’, ‘Wilson’, 3, 1),
(”, ‘Andy’, ‘Smith’, 1, 3), (”, ‘Lou’, ‘Waters’, 2, 4),
(”, ‘Jill’, ‘Stone’, 1, 4), (”, ‘Roger’, ‘White’, 3, 2),
(”, ‘Howard’, ‘Andrews’, 1, 2), (”, ‘Fred’, ‘Goldberg’, 3, 3),
(”, ‘Barbara’, ‘Brown’, 2, 3), (”, ‘Alice’, ‘Rogers’, 2, 2),
(”, ‘Mark’, ‘Morgan’, 3, 3), (”, ‘Karen’, ‘Cole’, 3, 2);
You can see which rows are stored in partition p1 like this:

      mysql> SELECT * FROM employees PARTITION (p1);

+—-+——-+——–+———-+—————+
| id | fname | lname | store_id | department_id |
+—-+——-+——–+———-+—————+
| 5 | Mary | Jones | 1 | 1 |
| 6 | Linda | Black | 2 | 3 |
| 7 | Ed | Jones | 2 | 1 |
| 8 | June | Wilson | 3 | 1 |
| 9 | Andy | Smith | 1 | 3 |
+—-+——-+——–+———-+—————+
5 rows in set (0.00 sec)

其结果是相同的,所获得结果从SELECT * FROM employees WHERE id BETWEEN 5 AND 9.

要从多个分区得到数据,提供它们的名字作为逗号分隔的列表,比如,

SELECT * FROM employees PARTITION (p1, p2) 返回P1和P2分区所有的记录:

对分区表进行任何有效的查询, 可以重写用一个分区选项 来限制结果到一个或者多个需要的分区。你可以使用WHERE 条件,ORDER BY 和LIMIT 选项 等等

你还可以使用聚合函数使用HAVING 和GROUP BY 选项:

mysql> SELECT * FROM employees PARTITION (p0, p2)
-> WHERE lname LIKE ‘S%’;
+—-+——-+——-+———-+—————+
| id | fname | lname | store_id | department_id |
+—-+——-+——-+———-+—————+
| 4 | Jim | Smith | 2 | 4 |
| 11 | Jill | Stone | 1 | 4 |
+—-+——-+——-+———-+—————+
2 rows in set (0.00 sec)

mysql> SELECT id, CONCAT(fname, ’ ‘, lname) AS name
-> FROM employees PARTITION (p0) ORDER BY lname;
+—-+—————-+
| id | name |
+—-+—————-+
| 3 | Ellen Johnson |
| 4 | Jim Smith |
| 1 | Bob Taylor |
| 2 | Frank Williams |
+—-+—————-+
4 rows in set (0.06 sec)

mysql> SELECT store_id, COUNT(department_id) AS c
-> FROM employees PARTITION (p1,p2,p3)
-> GROUP BY store_id HAVING c > 4;
+—+———-+
| c | store_id |
+—+———-+
| 5 | 2 |
| 5 | 3 |
+—+———-+
2 rows in set (0.00 sec)

语句使用分区查询可以被用于使用任何分区类型的, 当一个表时使用 [LINEAR] HASH or [LINEAR] KEY 分区和

分区的名字没有指定,MySQL 自动命名分区p0,p1,p2….pN-1, N是分区的数量。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

scan724

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值