当您使用日期范围时,似乎mysql只选择第一个分区和最后一个分区的数据。
| sales | CREATE TABLE `sales` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`quantity_sold` int(11) NOT NULL,
`prod_id` int(11) NOT NULL,
`store_id` int(11) NOT NULL,
`date` date NOT NULL,
KEY `prod_id` (`prod_id`),
KEY `date` (`date`),
KEY `store_id` (`store_id`),
KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=577574322 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (to_days(date))
(PARTITION p0 VALUES LESS THAN (0) ENGINE = InnoDB,
PARTITION p201211 VALUES LESS THAN (735203) ENGINE = InnoDB,
PARTITION p201212 VALUES LESS THAN (735234) ENGINE = InnoDB,
PARTITION p201301 VALUES LESS THAN (735265) ENGINE = InnoDB,
PARTITION p201302 VALUES LESS THAN (735293) ENGINE = InnoDB,
PARTITION p201303 VALUES LESS THAN (735324) ENGINE = InnoDB,
PARTITION p201304 VALUES LESS THAN (735354) ENGINE = InnoDB,
PARTITION p201305 VALUES LESS THAN (735385) ENGINE = InnoDB,
PARTITION p201306 VALUES LESS THAN (735415) ENGINE = InnoDB,
PARTITION p201307 VALUES LESS THAN (735446) ENGINE = InnoDB,
PARTITION p201308 VALUES LESS THAN (735477) ENGINE = InnoDB,
PARTITION p201309 VALUES LESS THAN (735507) ENGINE = InnoDB,
PARTITION p201310 VALUES LESS THAN (735538) ENGINE = InnoDB,
PARTITION p201311 VALUES LESS THAN (735568) ENGINE = InnoDB,
PARTITION p201312 VALUES LESS THAN (735599) ENGINE = InnoDB,
PARTITION p201401 VALUES LESS THAN (735630) ENGINE = InnoDB,
PARTITION p201402 VALUES LESS THAN (735658) ENGINE = InnoDB,
PARTITION p201403 VALUES LESS THAN (735689) ENGINE = InnoDB,
PARTITION p201404 VALUES LESS THAN (735719) ENGINE = InnoDB,
PARTITION p201405 VALUES LESS THAN (735750) ENGINE = InnoDB,
PARTITION p201406 VALUES LESS THAN (735780) ENGINE = InnoDB,
PARTITION p201407 VALUES LESS THAN (735811) ENGINE = InnoDB,
PARTITION p201408 VALUES LESS THAN (735842) ENGINE = InnoDB,
PARTITION p201409 VALUES LESS THAN (735872) ENGINE = InnoDB,
PARTITION p201410 VALUES LESS THAN (735903) ENGINE = InnoDB,
PARTITION p201411 VALUES LESS THAN (735933) ENGINE = InnoDB,
PARTITION p201412 VALUES LESS THAN (735964) ENGINE = InnoDB,
PARTITION P201501 VALUES LESS THAN (735995) ENGINE = InnoDB,
PARTITION P201502 VALUES LESS THAN (736023) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */ |
选择销售(应该从所有分区获取数据)但仅限于第一个和最后一个?
`mysql> select * from sales where prod_id = 232744 and store_id = 300;
+-----------+---------------+---------+----------+------------+
| id | quantity_sold | prod_id | store_id | date |
+-----------+---------------+---------+----------+------------+
| 2309 | 1 | 232744 | 300 | 2012-11-26 |
| 2484 | 10 | 232744 | 300 | 2012-11-27 |
| 2837 | 7 | 232744 | 300 | 2012-11-29 |
| 3001 | 9 | 232744 | 300 | 2012-11-30 |
| 571930074 | 4 | 232744 | 300 | 2014-12-02 |
| 573051350 | 13 | 232744 | 300 | 2014-12-03 |
| 574181358 | 5 | 232744 | 300 | 2014-12-04 |
| 575322316 | 9 | 232744 | 300 | 2014-12-05 |
| 576455102 | 4 | 232744 | 300 | 2014-12-06 |
| 577545446 | 2 | 232744 | 300 | 2014-12-07 |
+-----------+---------------+---------+----------+------------+`
说明分区显示它正在扫描所有分区。
mysql> explain partitions select * from sales where prod_id = 232744 and store_id =300\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: sales
partitions: p0,p201211,p201212,p201301,p201302,p201303,p201304,p201305,p201306,p201307,p201308,p201309,p201310,p201311,p201312,p201401,p201402,p201403,p201404,p201405,p201406,p201407,p201408,p201409,p201410,p201411,p201412,P201501,P201502,p1
type: index_merge
possible_keys: prod_id,store_id
key: prod_id,store_id
key_len: 4,4
ref: NULL
rows: 20
Extra: Using intersect(prod_id,store_id); Using where
1 row in set (0.00 sec)
如果我手动选择分区,我们可以看到那里有数据,应该在上面的数据中。
`mysql> select * from sales PARTITION (p201410) where prod_id = 232744 and store_id = 300;
+-----------+---------------+---------+----------+------------+
| id | quantity_sold | prod_id | store_id | date |
+-----------+---------------+---------+----------+------------+
| 509534154 | 2 | 232744 | 300 | 2014-10-01 |
| 510606312 | 10 | 232744 | 300 | 2014-10-02 |
| 511682398 | 4 | 232744 | 300 | 2014-10-03 |
| 512752933 | 2 | 232744 | 300 | 2014-10-04 |
| 514812731 | 3 | 232744 | 300 | 2014-10-06 |
| 515862308 | 6 | 232744 | 300 | 2014-10-07 |
| 516922728 | 5 | 232744 | 300 | 2014-10-08 |
| 517990349 | 19 | 232744 | 300 | 2014-10-09 |
| 519066761 | 17 | 232744 | 300 | 2014-10-10 |
| 520136175 | 3 | 232744 | 300 | 2014-10-11 |
| 522185901 | 1 | 232744 | 300 | 2014-10-14 |
| 523238559 | 3 | 232744 | 300 | 2014-10-15 |
| 524294166 | 7 | 232744 | 300 | 2014-10-16 |
| 525354982 | 3 | 232744 | 300 | 2014-10-17 |
| 526412605 | 1 | 232744 | 300 | 2014-10-18 |
| 527444329 | 1 | 232744 | 300 | 2014-10-19 |
| 528452608 | 1 | 232744 | 300 | 2014-10-20 |
| 529488414 | 2 | 232744 | 300 | 2014-10-21 |
| 530541002 | 3 | 232744 | 300 | 2014-10-22 |
| 531603714 | 4 | 232744 | 300 | 2014-10-23 |
| 532672667 | 6 | 232744 | 300 | 2014-10-24 |
| 534793524 | 1 | 232744 | 300 | 2014-10-26 |
| 535819138 | 1 | 232744 | 300 | 2014-10-27 |
| 537957232 | 1 | 232744 | 300 | 2014-10-29 |
| 539037254 | 1 | 232744 | 300 | 2014-10-30 |
| 540125545 | 2 | 232744 | 300 | 2014-10-31 |
+-----------+---------------+---------+----------+------------+
26 rows in set (0.03 sec)`
如果你要从销售中选择*,其中prod_id = 232744;它将选择所有数据。似乎只是当你在那里添加store_id条件时它没有选择正确的数据。
我很难过。我试过了:
谢谢!