MySQL分区按月无效

时间:2014-06-27 14:30:36

标签: mysql database-partitioning

我通过

创建一个表
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)

1 个答案:

答案 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;

但是,我怀疑日期范围分区是一个更好的解决方案。