我创建一个表
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)
您的查询是:
select *
from part_tab
where use_time = '2013-02-01';
您的分区语句为:
PARTITION BY HASH(MONTH(use_time)) PARTITIONS 12;
您尝试做的事情称为“分区修剪”。根据文档,
当分区表达式使用YEAR()或TO_DAYS()函数时,修剪还可以应用于在DATE或DATETIME列上分区的表。另外,在MySQL 5.7中,当分区表达式使用TO_SECONDS()函数时,可以对此类表应用修剪。
我不相信有什么办法做到分区直接修剪MONTH()
代替YEAR()
。您可以将查询重写为:
select *
from part_tab
where month(use_time) = 1;
但是,我怀疑按日期进行范围分区是更好的解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句