按范围或按列表分区 - Mysql?

时间:2012-06-20 06:33:04

标签: mysql database partitioning

我可以在我的情况下按范围划分或按我的新网站列表,下面是我可以选择的两个示例,

partition BY LIST(`category`)( 
PARTITION p0 VALUES IN(0), 
PARTITION p1 VALUES IN(1), 
PARTITION p2 VALUES IN(2), 
PARTITION p3 VALUES IN(3),
PARTITION p4 VALUES IN(4),
PARTITION p5 VALUES IN(5),
PARTITION p6 VALUES IN(6)
);

或者我能做到,

PARTITION BY RANGE (`category`)(
PARTITION p0 VALUES LESS THAN (1),
PARTITION p1 VALUES LESS THAN (2),
PARTITION p2 VALUES LESS THAN (3),
PARTITION p3 VALUES LESS THAN (4),
PARTITION p4 VALUES LESS THAN (5),
PARTITION p5 VALUES LESS THAN (6),
PARTITION p6 VALUES LESS THAN (7)
);

由于我不知道有哪些分区哪个更适合选择?

我也发现我也可以这样做,

partition BY HASH(`category`)
partitions 7;

有没有更好的选择,或者它真的没关系?

作为最后一个问题 - 我有7个不同的类别。选择最后一个选项如果我要使用超过7个分区会发生什么?这只是愚蠢的做法,还是会提高性能。

感谢您抽出宝贵时间阅读我的问题!

2 个答案:

答案 0 :(得分:2)

您在MySQL中有4种可用的策略:RANGE,LIST,KEY和HASH。

如果需要按分区列的特定值进行分区,则RANGE和LIST是为此设计的。如果您不需要按列的特定值为文件分配行,那么KEY和HASH更适合您。

在你的情况下,所有三种方法(LIST,RANGE和HASH)的工作方式完全相同,因为你有7个分区,`category` = 0的行将存储在p0中,`category` = 1 in p1等等。

在HASH分区中,为了确定哪个文件将用于存储某一行,MySQL使用模数(mod)操作:

partition_number = hash(partitioning_column) mod number_of_partitions

在你的HASH案例中,分区号码为:

partition_number = category mod 7(您没有使用任何哈希函数,因此默认情况下使用身份。)

创建更多(或更少)分区而不是值可以使分区列不一定无用,但如果您使用标识作为哈希函数,那么创建更多分区是没用的。

想象一下,您只有7个类别,但您定义了20个分区:

PARTITION BY HASH(`category`)
PARTITIONS 20;

如0 mod 7 = 0,1 mod 7 = 1,2 mod 7 = 2,3 mod 7 = 3,4 mod 7 = 4,5 mod 7 = 5和6 mod 7 = 6,其余分区(p7-p19)永远不会被使用。它不会增加或减少性能,它只是没用。

现在假设您仍然拥有7个类别,但只有4个分区:

PARTITION BY HASH(`category`)
PARTITIONS 4;

0 mod 4 = 0,1 mod 4 = 1,2 mod 4 = 2,3 mod 4 = 3, 4 mod 4 = 0,5 mod 4 = 1,6 mod 4 = 2

发生什么事了?文件p0将包含`category` = 0和`category` = 4的行,p1将包含`category` = 1和`category` = 5的行,p2将包含`category` = 2和`category的行`= 6和p3只包含`category` = 3的行。

这会增加还是降低性能?它取决于您在此表上运行的SELECT查询。如果你运行这样的查询:

SELECT * FROM `table_name` WHERE `category` = 0 or `category` = 4;

它非常完美,因为只能访问一个分区。但另一个例子恰恰相反:

SELECT * 
FROM `table_name` 
WHERE `category` = 0 OR `category` = 1 OR `category` = 2 OR`category` = 3;

需要访问所有分区以检索数据。

如果您输入以下内容,MySQL会为您提供此信息:

EXPLAIN PARTITIONS SELECT_QUERY;
example: EXPLAIN PARTITIONS SELECT * FROM `table_name` WHERE `category` = 0 or `category` = 4;

关于使用哪种替代方法,因为LIST和RANGE分区用于指定列表或值范围,并且每个分区只有一个值,在这种情况下我会选择 HASH分区

答案 1 :(得分:0)

分区方法的选择应该基于我们对表进行分区的候选者,如果你有一个固定的候选值(一年中的前一个月)你可以去列表分区,或者你有候选人的各种值,然后去范围分区。