通过数据mysql进行分区

时间:2017-02-17 05:18:34

标签: mysql partitioning

我有桌子'项目'。 18万条记录:

CREATE TABLE IF NOT EXISTS `items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `log_id` int(11) NOT NULL,
  `res_id` int(11) NOT NULL,
  `link` varchar(255) NOT NULL,
  `title` text NOT NULL,
  `content` text NOT NULL,
  `n_date` varchar(255) NOT NULL,
  `nd_date` int(11) NOT NULL,
  `s_date` int(11) NOT NULL,
  `not_date` date NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `link_2` (`link`),
  KEY `log_id` (`log_id`),
  KEY `res_id` (`res_id`),
  KEY `now_date` (`not_date`),
  KEY `sql_index` (`res_id`,`id`,`not_date`)
) ENGINE=Aria  DEFAULT CHARSET=utf8 PAGE_CHECKSUM=0 AUTO_INCREMENT=18382133 ;

尝试对此表进行分区我创建了它的迷你副本,并在primary和uniq键中包含列'not_date':

CREATE TABLE IF NOT EXISTS `part_items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `log_id` int(11) NOT NULL,
  `res_id` int(11) NOT NULL,
  `link` varchar(255) NOT NULL,
  `title` text NOT NULL,
  `content` text NOT NULL,
  `n_date` varchar(255) NOT NULL,
  `nd_date` int(11) NOT NULL,
  `s_date` int(11) NOT NULL,
  `not_date` date NOT NULL,
  PRIMARY KEY (`not_date`,`id`),
  UNIQUE KEY `link_2` (`not_date`,`link`),
  KEY `log_id` (`log_id`),
  KEY `res_id` (`res_id`),
  KEY `now_date` (`not_date`),
  KEY `sql_index` (`res_id`,`id`,`not_date`)
) ENGINE=Aria  DEFAULT CHARSET=utf8 PAGE_CHECKSUM=0
/*!50100 PARTITION BY RANGE ( TO_DAYS(not_date))
(PARTITION p_1 VALUES LESS THAN (735963) ENGINE = Aria,
 PARTITION p_2 VALUES LESS THAN (736694) ENGINE = Aria) */ AUTO_INCREMENT=18414661 ;

然后我运行sql_query:

alter table `part_items` PARTITION BY RANGE( TO_DAYS(not_date) ) (
PARTITION p_1 VALUES LESS THAN( TO_DAYS('2014-12-31') ),
PARTITION p_2 VALUES LESS THAN( TO_DAYS('2016-12-31') )
);

然后我尝试选择必须在p_1中的记录并解释分区向我显示搜索仅在p_1中。但是当我选择必须在p_2中的记录时,解释分区显示全扫描(p_1,p_2)。 我的代码有什么问题? 查询:

explain partitions SELECT * FROM `part_items` where content like '%k%' and not_date < '2014-05-12'

explain partitions SELECT * FROM `part_items` where content like '%k%' and not_date > '2015-01-01'

还有一个问题:是否可以对视图进行分区? enter image description here

1 个答案:

答案 0 :(得分:0)

当某个日期PARTITIONing起作用时,可能会提供无效日期。这将导致NULL;这些值存储在第一个分区中。

这个问题惹恼了很多开发人员。典型的解决方法&#39;是让第一个分区为空,以便查看它的努力(通常)是最小的。在你的情况下:

PARTITION p_0 VALUES LESS THAN(0)

分区少于6个分区通常不值得付出努力;你会添加更多分区吗?

(警告:我的建议来自多年的MyISAM / InnoDB分区;我不知道Aria的工作方式不同。我怀疑分区是主要处理引擎独立层。 )