MYSQL中的子分区
我需要按日期对表进行分区,然后这个分区需要按用户ID进行子分区。 我有如下分区表: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将子分区
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,我向您提出这一挑战。)您对其进行了测试,但您是否确定哈希
或子分区
有任何性能优势?(比尔,我向你提出这个挑战。)