我需要明智地分区表,然后这个分区需要由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'。
答案 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
更好。它可能会更糟。