首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL子分区剪枝

MYSQL子分区剪枝
EN

Stack Overflow用户
提问于 2011-12-07 22:14:31
回答 2查看 1.8K关注 0票数 1

我有一个MYSQL表,在年份上有分区,在月份上有子分区。

代码语言:javascript
复制
CREATE TABLE ptable (
   id INT NOT NULL AUTO_INCREMENT, 
   name varchar(100),
   purchased DATETIME NOT NULL,
   PRIMARY KEY (id, purchased)
)

PARTITION BY RANGE( YEAR(purchased) )
SUBPARTITION BY HASH( MONTH(purchased) )
SUBPARTITIONS 12 (
   PARTITION p0 VALUES LESS THAN (2011),
   PARTITION p1 VALUES LESS THAN (2012),
   PARTITION p5 VALUES LESS THAN MAXVALUE
);

我对这个表的大多数查询都涉及年份或月份。当我尝试按月查询时,它没有正确地进行剪枝和扫描给定年份的所有12个子分区。

代码语言:javascript
复制
explain partitions

SELECT *
FROM ptable
WHERE purchased BETWEEN '2011-12-01' AND '2011-12-31';

我的问题是,当我知道年份和月份值时,有一种方法可以告诉MYSQL只查询特定的子分区吗?或者也许还有更好的办法。我正在使用MySQL5.1。

EN

回答 2

Stack Overflow用户

发布于 2011-12-07 22:20:18

http://dev.mysql.com/doc/refman/5.1/en/partitioning-pruning.html说:

当分区表达式使用

TO_DAYS()函数时,还可以对在日期或日期时间列上分区的表应用YEAR()剪枝。

在MySQL 5.5中,他们将TO_SECONDS()添加到仍然非常短的函数列表中,MySQL足够聪明地用于分区剪枝。

因此,您应该能够对子分区进行剪枝,以便使用:

代码语言:javascript
复制
SUBPARTITION BY HASH( TO_DAYS(purchased)/30 )

您仍然可以使用12个子分区,您只会发现每个月的数据都不能准确地与子分区对齐。但它会在可能的时候修剪。

另一种选择是可以向表中添加另一列,例如purchased_month TINYINT UNSIGNED,并将MONTH(purchased)值冗余地存储在该列中。然后将它用作您的子分区键:

代码语言:javascript
复制
SUBPARTITION BY HASH( purchased_month )
票数 0
EN

Stack Overflow用户

发布于 2016-08-23 03:18:16

5.6.2开始,选择支持显式分区选择,使用带分区或子分区列表的分区关键字

对于那些使用更新的MySQL的人,我们可以使用SELECT * FROM kit.t1 PARTITION (partition_name [, partition_name] ...);从指定的表(子)分区中选择行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8423361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档