2012-06-20 68 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