2011-03-23 62 views
6

我知道,從MySQL 5.5開始,現在可以通過像varchar這樣的非整數值對錶進行分區。我有一個表,我在單個varchar列上執行了很多查找,因此我想在性能方面進行分區。MySQL 5.5分區表由A-Z

在所有情況下,列的值都是單個字母字(嚴格說小寫a-z,通過驗證強制執行)。

我想什麼做的是分區此表由每個單詞的第一個字母存儲,所以用開頭的所有單詞「一個」走在第一個分區,「B」第二等

我直覺是我可以構建create/alter table語句來使用LIKE語句,但我不確定語法。

有沒有人用MySQL 5.5做過這樣的事情?

回答

6

如果您決定按第一個字母來做,我認爲RANGE partitioning可以做到這一點。但是,如果您對第一個字母的分區沒有絕對要求,則LINEAR KEY partitioning可能會更好。

下面是我從選址手冊頁解除和修改爲使用VARCHAR列的例子:

CREATE TABLE employees (
    id INT NOT NULL, 
    fname VARCHAR(30), 
    lname VARCHAR(30), 
    hired DATE NOT NULL DEFAULT '1970-01-01', 
    separated DATE NOT NULL DEFAULT '9999-12-31', 
    job_code INT NOT NULL, 
    store_id INT NOT NULL 
) 
PARTITION BY RANGE COLUMNS(fname) (
    PARTITION p0 VALUES LESS THAN ('h'), 
    PARTITION p1 VALUES LESS THAN ('m'), 
    PARTITION p2 VALUES LESS THAN ('t'), 
    PARTITION p3 VALUES LESS THAN MAXVALUE 
); 

並運行它:

... Physical database connection acquired for: Feynman 
12:33:07 [CREATE - 0 row(s), 0.062 secs] Command processed. No rows were affected 
... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.062/0.000 sec [0 successful, 1 warnings, 0 errors] 
+0

我沒有看到RANGE分區的任何語法除了數字和日期以外的任何東西。我認爲線性鍵可能是唯一的選擇... – jswolf19 2011-03-23 15:47:39

+0

謝謝湯姆,這是接近我所需要的,但是我需要它作用於fname的子字符串(僅第一個字符),並且LESS THAN不是貪婪就足夠了,因爲我希望它只是該分區中的那封信,所以平等可能更合適。 – alphadevx 2011-03-23 16:46:40

+0

任何小於'b'的東西都將以'a'開頭。之後,小於'c'的任何內容都將以'b'開頭。等等...這讓你按第一個字母進行分區,但仍然允許查詢優化器在給出'fname ='albert''時執行它的操作。 – 2011-03-23 16:55:00