使用MYSQL中的单个查询从多个表分区中获取数据

时间:2015-03-19 11:04:45

标签: mysql partitioning database-optimization

我使用以下语法在MYSQL中创建了一个表:

CREATE TABLE  `demo` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `date` datetime NOT NULL COMMENT 'date',
  `desc` enum('error','audit','info') NOT NULL,
  PRIMARY KEY (`id`,`date`)
)
PARTITION BY RANGE (MONTH(`date`))
(
 PARTITION JAN VALUES LESS THAN (2),
 PARTITION FEB VALUES LESS THAN (3),
 PARTITION MAR VALUES LESS THAN (4),
 PARTITION APR VALUES LESS THAN (5),
 PARTITION MAY VALUES LESS THAN (6),
 PARTITION JUN VALUES LESS THAN (7),
 PARTITION JUL VALUES LESS THAN (8),
 PARTITION AUG VALUES LESS THAN (9),
 PARTITION SEP VALUES LESS THAN (10),
 PARTITION OCT VALUES LESS THAN (11),
 PARTITION NOV VALUES LESS THAN (12),
 PARTITION `DEC` VALUES LESS THAN (MAXVALUE)
);

这里的id和date是组合的主键,我使用date作为分区列。我根据日期中的月份制作分区。 该表已成功创建,并且数据将根据分区正确插入其中。

如果我触发需要跨多个分区获取记录的查询,会对性能产生什么影响?

请考虑以下查询:

SELECT * FROM `demo` WHERE `between` '2015-02-01 00:00:00' AND '2015-05-31 00:00:00';

1 个答案:

答案 0 :(得分:1)

查询需要查看所有分区。优化器不够聪明,无法理解日期范围的基本原则,当它们被包裹时#34;通过MONTH()函数。

您可以通过执行EXPLAIN PARTITIONS SELECT ...;来查看此内容。

即使它足够聪明,只能触及4个分区, <{em> SELECT 您也可以删除分区并在date上添加索引。

由于此表名为demo,因此我怀疑它不是最终版本。如果您想谈谈PARTITIONing是否对您的应用程序有用,请让我们看看真正的架构和重要的查询。