MYSQL分区选择不工作

MYSQL分区选择不工作,mysql,database,partition,Mysql,Database,Partition,当您使用日期范围时,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,

当您使用日期范围时,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) */ |
选择sales(应该从所有分区获取数据),但只从第一个分区和最后一个分区获取数据

`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 |
    +-----------+---------------+---------+----------+------------+`
explain分区显示它正在扫描所有分区

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;它将选择所有数据。似乎只是当您在其中添加存储id条件时,它没有选择正确的数据

我被难住了。我试过:

  • 重新启动mysql
  • 我将尝试优化表(由于空间限制,我必须移动数据库)
  • 在我看来,钥匙有问题吗?损坏的表
  • 谢谢