【问题标题】:MySQL 5.5 partition table by A-ZMySQL 5.5 分区表按 A-Z
【发布时间】:2011-03-23 15:22:36
【问题描述】:

我了解到,从 MySQL 5.5 开始,您现在可以按 varchar 等非整数值对表进行分区。我有一个表,我在其中对单个 varchar 列执行大量查找,因此出于性能原因我想对其进行分区。

在所有情况下,列的值都是单个字母单词(严格小写 a-z,由验证强制执行)。

我想做的是按存储的每个单词中的第一个字母对该表进行分区,因此所有以“a”开头的单词都进入第一个分区,“b”进入第二个分区,等等。

我的直觉是,我可能可以构造 create/alter table 语句来使用 LIKE 语句,但不确定语法。

有人用 MySQL 5.5 做过类似的事情吗?

【问题讨论】:

    标签: mysql database-partitioning


    【解决方案1】:

    如果您下定决心从第一个字母开始,我认为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]
    

    【讨论】:

    • 除了数字和日期之外,我没有看到任何 RANGE 分区的语法。我认为线性键可能是这里唯一的选择...
    • 谢谢汤姆,这与我需要的很接近,但是我需要它来作用于 fname 的子字符串(仅限第一个字符),并且 LESS THAN 不够贪婪,因为我想要它仅是该分区中的那个字母,因此等号可能更合适。
    • 任何小于“b”的内容都以“a”开头。之后,任何小于“c”的都将以“b”开头。依此类推...这可以让您按首字母进行分区,但仍然允许查询优化器在您获得fname = 'albert' 时执行其操作。
    • 感谢汤姆的澄清,现在说得通了。明天我将对您提出的方法进行一些测试,并将在此处发布更新。
    • 您还需要将分区列(在本例中为 fname)添加到表的主键中。
    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 2012-06-25
    • 2011-06-22
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多