MYSQL中的子分区

时间:2016-11-29 06:35:49

标签: mysql sql partitioning

我需要明智地分区表,然后这个分区需要由userid进行子分区。 我有如下的分区表:

ALTER TABLE sentbox1 PARTITION BY RANGE(to_days(CreatedDateTime))(
PARTITION p20161130 VALUES LESS THAN (to_days('2016-11-30')),
PARTITION p20161201 VALUES LESS THAN (to_days('2016-12-01'))
);

现在,如何通过userid将子分区添加到分区' p20161130'和' p20161201'。

2 个答案:

答案 0 :(得分:0)

我在MySQL 8.0.0-dmr上测试了这个:

ALTER TABLE sentbox1 
PARTITION BY RANGE(to_days(CreatedDateTime)) 
SUBPARTITION BY HASH(userid) 
SUBPARTITIONS 4 (
  PARTITION p20161130 VALUES LESS THAN (to_days('2016-11-30')),
  PARTITION p20161201 VALUES LESS THAN (to_days('2016-12-01'))
);

请注意,子分区仅适用于HASH或KEY作为分区方法。

有关详细信息,请参阅https://dev.mysql.com/doc/refman/5.7/en/partitioning-subpartitions.html

来自Rick的评论:

@RickJames,我想你知道这完全取决于一个运行的查询是否与分区和子分区一致。如果您的查询逻辑导致查询跨越子分区,则不会带来任何好处。

我确实在子分区密钥上确认了分区修剪heeds条件。

当我只在主分区键上放置一个条件时,它必须扫描该分区的所有子分区:

mysql> explain partitions select * from sentbox1 
    where createddatetime = from_days(736663) \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: sentbox1
   partitions: p20161201_p20161201sp0,
               p20161201_p20161201sp1,
               p20161201_p20161201sp2,
               p20161201_p20161201sp3
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 1
     filtered: 100.00
        Extra: Using where

当我在userid(子分区键)上另外指定条件时,我们会看到要检查的子分区的子集减少:

mysql> explain partitions select * from sentbox1 
    where createddatetime = from_days(736663) and userid=3\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: sentbox1
   partitions: p20161201_p20161201sp3 
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 1
     filtered: 100.00
        Extra: Using where

答案 1 :(得分:0)

有时问题的答案是"不要"。我还没有找到SUBPARTITION的任何用途。请解释您认为这将有用的用例。

特别是,分区本质上不会带来任何性能优势。

BY RANGE(TO_DAYS(..))的通常用例是当您需要删除“旧”字样时。数据。执行DROP PARTITION的效率明显高于DELETE。你有这种情况吗?如果是这样,那么SUBPARTITIONs对我所知道的任何方式都无济于事。

与此同时,我找到了HASH no 用例。当然,它可能会对userid进行修剪,但修剪并不比在复合索引开始时使用userid更好。它可能会更糟。

More discussion of Partitioning