2011-03-23 97 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