我有一个MYSQL表,在年份上有分区,在月份上有子分区。
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个子分区。
explain partitions
SELECT *
FROM ptable
WHERE purchased BETWEEN '2011-12-01' AND '2011-12-31';我的问题是,当我知道年份和月份值时,有一种方法可以告诉MYSQL只查询特定的子分区吗?或者也许还有更好的办法。我正在使用MySQL5.1。
发布于 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足够聪明地用于分区剪枝。
因此,您应该能够对子分区进行剪枝,以便使用:
SUBPARTITION BY HASH( TO_DAYS(purchased)/30 )您仍然可以使用12个子分区,您只会发现每个月的数据都不能准确地与子分区对齐。但它会在可能的时候修剪。
另一种选择是可以向表中添加另一列,例如purchased_month TINYINT UNSIGNED,并将MONTH(purchased)值冗余地存储在该列中。然后将它用作您的子分区键:
SUBPARTITION BY HASH( purchased_month )发布于 2016-08-23 03:18:16
从
5.6.2开始,选择支持显式分区选择,使用带分区或子分区列表的分区关键字
对于那些使用更新的MySQL的人,我们可以使用SELECT * FROM kit.t1 PARTITION (partition_name [, partition_name] ...);从指定的表(子)分区中选择行。
https://stackoverflow.com/questions/8423361
复制相似问题