2012-06-20 48 views
2

我可以在我的情况无论是范围或列表我的新网站的分区,下面是这两个我可以选择的一个例子,按范围或按列表划分 - Mysql?

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

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

如果您需要按分区列的特定值进行分区,则会为此设计RANGE和LIST。如果您不需要通过列的特定值将行分配给文件,那么KEY和HASH更适合您。在你的情况下,所有三种方法(LIST,RANGE和HASH)的工作方式完全相同,因为你有7个分区,并且`category` = 0的行将被存储在p0中,`category` = 1 p1等。

在哈希分区,以确定哪些文件将被用于存储某行,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模7 = 0,1个模7 = 1,2模7 = 2,3模7 = 3,4模7 = 4,5模7 = 5和6模7 = 6,剩余的分区(p7-p19)将不会被使用。它不会增加或减少性能,它只是无用的。

现在想象一下,你仍然有7个大类,但你只有4个分区:

PARTITION BY HASH(`category`) 
PARTITIONS 4; 

0模4 = 0,1 MOD 4 = 1,2模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分区

0

选择划分方法应基于我们划分表的候选人,如果您有一些固定的值(该年的前一个月),您可以进行列表分区,或者是您对候选人有广泛的价值观,然后进行范围划分。

+0

叶我最后去的名单,因为价值观的任何一个值,没有范围。 – Griff