2012-03-03 66 views
0

我有一個還挺表是這樣的:Mysql分區錯誤?

CREATE TABLE test (
    id MEDIUMINT NOT NULL AUTO_INCREMENT, 
    user VARCHAR(30), 
    time VARCHAR(30), 
    status VARCHAR(30), 
    origin VARCHAR(30), 
    PRIMARY KEY (id) 
) ENGINE=MyISAM; 
PARTITION BY RANGE(id) (
    PARTITION p0 VALUES LESS THAN (500000), 
    PARTITION p1 VALUES LESS THAN (1000000), 
    PARTITION p2 VALUES LESS THAN (1500000), 
    PARTITION p3 VALUES LESS THAN (2000000), 
    PARTITION p4 VALUES LESS THAN (2500000)    
) 

我有三個問題:

1)我這裏有一個#1064錯誤;

2)我如何設置split test.user作爲分區中的字母範圍;

3)如何檢查分區是否成功;

回答

0

據我所知,你不能在char/varchar/text上使用RANGE分區。

你可以做的是添加一個名爲ascii_value的int列。然後創建一個插入/更新觸發器,它將使用字符串中第一個字母的ASCII值更新ascii_value列。

現在您可以在ascii_value列上對錶進行分區。

如果你想基於像 AA的前幾個字母組合 AB 交流 廣告

然後你就可以做到這一點更進一步,創建分區:

ascii_value = ascii_value_of_first_letter<<8 + ascii_value_of_second_letter

三字母:

ascii_value = ascii_value_of_first_letter<<16 + ascii_value_of_second_letter<<8 + ascii_value_of_third_letter

如您所見,對此方案的限制是ascii_value字段中可用的位數。但這不會成爲問題,因爲在耗盡ascii_value字段中的位之前,您會耗盡允許的分區數。

這是好的,如果你是HASH分區。對於範圍PARTITIONG,你最好做這樣的事情

ascii_value = (ascii_value_of_first_letter_in_uppercase - 65)*26 + ascii_value_of_second_letter_in_uppercase -65

這會給值的連續範圍。

查詢時,您將不得不對相應的邏輯應用於您要搜索的字符串。在where子句中添加一個條件,根據ascii_value字段過濾結果。這將修剪不必要的分區。

使用EXPLAIN PARTITIONS查看是否正在修剪分區。

PS:您必須將ascii_value添加到主鍵。

希望這會有所幫助:)