2011-07-25 91 views
3

好吧,我有200萬行。每個都有一個開票日期。我試圖在此日期之前對此進行分區。我做了分區。我檢查了/ var/lib/mysql並且文件在那裏,所有的文件都是合適的,這樣我就可以看到一些工作。但是,當我確定expores paritions select時,它仍然告訴我它正在使用所有分區。我是否在建造桌子時做錯了什麼?查詢表格?指標?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,但它使用的所有的人。

回答

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說法,這就是爲什麼沒有被使用的話):

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?

+0

謝謝。我已經使用了部分日期的東西很長一段時間,結果總是我的預期....它把'2011'視爲2011-01-01 00:00:00 – bbutle01