我有一张这样的表:
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 :(得分: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
添加到主键。
希望这会有所帮助:)