mysql分区无法正常工作

时间:2011-07-25 20:34:51

标签: mysql partitioning database-partitioning

好的,我有200万行。每个都有结算日期。我正试图在那个日期之前对其进行分区。我做了分区。我已经检查了/ var / lib / mysql并且文件都在那里,所有文件大小都合适,所以我可以看到一些工作正常。然而,当我选择时,它仍然告诉我它正在使用所有分区。我是如何建立表格的?查询表?索引?

CREATE TABLE `billing_bil` (
`id_bil` mediumint(9) unsigned NOT NULL AUTO_INCREMENT,
`bill_date_bil` date NOT NULL
PRIMARY KEY (`id`,`bill_date_bil`),
KEY `bill_date_bil` (`bill_date_bil`),
KEY `type_bill_date_bil` (`type_bil`,`bill_date_bil`)
) ENGINE=MyISAM AUTO_INCREMENT=2310168 DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE ( YEAR(bill_date_bil))
(PARTITION p0 VALUES LESS THAN (2008) ENGINE = MyISAM,
PARTITION p1 VALUES LESS THAN (2009) ENGINE = MyISAM,
PARTITION p2 VALUES LESS THAN (2010) ENGINE = MyISAM,
PARTITION p3 VALUES LESS THAN (2011) ENGINE = MyISAM,
PARTITION p4 VALUES LESS THAN (2012) ENGINE = MyISAM,
PARTITION p5 VALUES LESS THAN (2013) ENGINE = MyISAM,
PARTITION p6 VALUES LESS THAN (2014) ENGINE = MyISAM,
PARTITION p7 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */

EXPLAIN PARTITIONS SELECT SQL_NO_CACHE  id_bil FROM billing_bil WHERE bill_date_bil < '2010'
    id  select_type  table        partitions               type    possible_keys  key      key_len  ref        rows  Extra                   

 1  SIMPLE       billing_bil  p0,p1,p2,p3,p4,p5,p6,p7  index   bill_date_bil  PRIMARY  6        (NULL)  2310167  Using where; Using index

我希望该查询仅使用p0和p1,但它会使用所有这些。

1 个答案:

答案 0 :(得分:0)

你的分区很好。您的查询的WHERE子句是问题所在。当我在MySQL 5.5上运行EXPLAIN PARTITIONS语句时,有两个警告:

+---------+------+------------------------------------------------------------------+
| Level   | Code | Message                                                          |
+---------+------+------------------------------------------------------------------+
| Warning | 1292 | Incorrect date value: '2010' for column 'bill_date_bil' at row 1 |
| Warning | 1292 | Incorrect date value: '2010' for column 'bill_date_bil' at row 1 |
+---------+------+------------------------------------------------------------------+

如果您将查询更改为使用这样的实际日期,它将使用分区(我的CREATE TABLE语句中没有包含您的索引,这就是为什么它们没有被使用的原因):< / p>

mysql> EXPLAIN PARTITIONS SELECT SQL_NO_CACHE  id_bil FROM billing_bil WHERE bill_date_bil < '2010-01-01';
+----+-------------+-------------+------------+--------+---------------+------+---------+------+------+-------+
| id | select_type | table       | partitions | type   | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------------+------------+--------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | billing_bil | p0,p1,p2   | system | NULL          | NULL | NULL    | NULL |    1 |       |
+----+-------------+-------------+------------+--------+---------------+------+---------+------+------+-------+

我猜它使用了分区p2,因为MySQL支持部分日期(2010-00-00小于2010-01-01):How to deal with "partial" dates (2010-00-00) from MySQL in Django?