【问题标题】:Mysql partition error?Mysql分区错误?
【发布时间】:2012-03-03 16:31:19
【问题描述】:

我有一张这样的桌子:

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) 如何将拆分 test.user 设置为分区中的字母范围;

3) 如何检查分区是否成功;

【问题讨论】:

    标签: mysql range database-partitioning


    【解决方案1】:

    据我所知,您不能对 char/varchar/text 进行 RANGE 分区。

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

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

    如果您想更进一步并根据前几个字母的组合创建分区,例如 啊 抗体 交流 广告

    那么你可以这样做:

    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 分区,这没关系。对于范围分区,你最好做这样的事情

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

    希望这会有所帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 2015-12-25
      • 1970-01-01
      • 2014-03-03
      • 2023-04-10
      • 2013-09-20
      • 1970-01-01
      相关资源
      最近更新 更多