Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL中的子分区_Mysql_Sql_Partitioning - Fatal编程技术网

MYSQL中的子分区

MYSQL中的子分区,mysql,sql,partitioning,Mysql,Sql,Partitioning,我需要按日期对表进行分区,然后这个分区需要按用户ID进行子分区。 我有如下分区表: 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')) ); 现在,如何按用户ID将子分区

我需要按日期对表进行分区,然后这个分区需要按用户ID进行子分区。 我有如下分区表:

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'))
);

现在,如何按用户ID将子分区添加到分区“p20161130”和“p20161201”中

我在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'))
);
请注意,子分区只能使用哈希或键作为分区方法

有关更多信息,请参阅


Rick的重新评论:

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

我确认分区修剪注意子分区键上的条件

当我仅对主分区键设置条件时,它必须扫描该分区的所有子分区:

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
当我在
用户ID
(子分区键)上另外指定一个条件时,我们看到要检查的子分区的子集减少了:

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

我在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'))
);
请注意,子分区只能使用哈希或键作为分区方法

有关更多信息,请参阅


Rick的重新评论:

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

我确认分区修剪注意子分区键上的条件

当我仅对主分区键设置条件时,它必须扫描该分区的所有子分区:

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
当我在
用户ID
(子分区键)上另外指定一个条件时,我们看到要检查的子分区的子集减少了:

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

有时问题的答案是“不要”。我还没有找到
子分区的任何用途。请解释您认为有帮助的用例

特别是,分区本质上没有提供任何性能优势

按范围(到_天(..)
的通常用例是当您需要删除“旧”数据时。执行
删除分区
删除
效率更高。你的情况就是这样吗?如果是这样,拥有
子分区
在我所知的任何方面都没有帮助

同时,我没有发现
散列的用例。当然,它可以对
userid
进行修剪,但这种修剪并不比在复合索引的开头使用
userid
更好。而且情况可能更糟


.

有时问题的答案是“不要”。我还没有找到
子分区的任何用途。请解释您认为有帮助的用例

特别是,分区本质上没有提供任何性能优势

按范围(到_天(..)
的通常用例是当您需要删除“旧”数据时。执行
删除分区
删除
效率更高。你的情况就是这样吗?如果是这样,拥有
子分区
在我所知的任何方面都没有帮助

同时,我没有发现
散列的用例。当然,它可以对
userid
进行修剪,但这种修剪并不比在复合索引的开头使用
userid
更好。而且情况可能更糟


.

您对其进行了测试,但您是否确定
哈希
子分区
有任何性能优势?(Bill,我向您提出这一挑战。)您对其进行了测试,但您是否确定
哈希
子分区
有任何性能优势?(比尔,我向你提出这个挑战。)