Mysql分区错误?

时间:2012-03-03 16:31:19

标签: mysql range database-partitioning

我有一张这样的表:

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)我如何检查分区是否成功;

1 个答案:

答案 0 :(得分:0)

据我所知,你不能在char / varchar / text上进行RANGE分区。

您可以做的是添加一个名为ascii_value的int列。然后创建一个before insert / update触发器,它将使用字符串中第一个字母的ASCII值更新ascii_value列。

现在您可以在ascii_value列上对表进行分区。

如果你想进一步根据前几个字母的组合创建分区 AA AB AC 广告

然后你可以这样做:

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添加到主键。

希望这会有所帮助:)