我测试了在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了解更多信息。从里克
回复评论:
@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
当我另外指定的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
您测试了它,但您是否确定对HASH或SUBPARTITION有任何性能优势? (我把这当成是对你的挑战,比尔。) –