按月划分MySQL分区不起作用

滑船

我创建一个表

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)
戈登·利诺夫(Gordon Linoff)

您的查询是:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章