我通过
创建一个表CREATE TABLE `part_tab` (
`id` int NOT NULL,
`use_time` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY HASH(MONTH(use_time)) PARTITIONS 12;
然后我使用EXPLAIN PARTIONS语法,但似乎MySQL没有使用该分区,它仍然扫描整个表:
mysql> explain partitions select * from part_tab where use_time < '2013-02-01' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: part_tab
partitions: p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 12
Extra: Using where
1 row in set (0.00 sec)
如果我将where条件更改为相等,则使用分区:
mysql> explain partitions select * from part_tab where use_time = '2013-02-01' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: part_tab
partitions: p2
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 2
Extra: Using where
1 row in set (0.00 sec)
答案 0 :(得分:1)
您的查询是:
select *
from part_tab
where use_time = '2013-02-01';
您的分区声明是:
PARTITION BY HASH(MONTH(use_time)) PARTITIONS 12;
您要做的事情称为&#34;分区修剪&#34;。根据{{3}},
修剪也可以应用于在DATE或分区上分区的表 分区表达式使用YEAR()或时的DATETIME列 TO_DAYS()函数。此外,在MySQL 5.7中,可以应用修剪 对于这样的表,当分区表达式使用TO_SECONDS()时 功能
我不相信有任何方法可以直接在MONTH()
上而不是YEAR()
进行分区修剪。您可以将查询重写为:
select *
from part_tab
where month(use_time) = 1;
但是,我怀疑日期范围分区是一个更好的解决方案。