【问题标题】:Partitioning a database table in MySQL在 MySQL 中对数据库表进行分区
【发布时间】:2009-12-20 17:12:48
【问题描述】:

我正在编写一个数据仓库,使用MySQL 作为后端。我需要根据两个整数 ID 和一个名称字符串对表进行分区。

一个更具体的例子是假设我正在存储关于一所学校的数据。我想根据 COMPOSITE 'Key' 对 school_data 表进行分区:

school id (integer)
course_id (integer)
student_surname (string)

对于学生姓氏,只是姓氏的第一个字符决定了数据应该进入哪个“分区表”。

如何使用 MySQL (5.1) 和 InnoDb 表来实现这个要求?

另外,我正在 Windows 机器上进行开发,但我将部署到 *nix 机器上进行生产。我还有两个问题:

  1. 我假设在从 Windows 迁移到 Linux 时必须转储和恢复数据。如果数据库包含分区表,我不知道这是否可以(指向它在文档中声明的位置的指针会让我放心 - 我无法找到任何关于分区表的转储/恢复的具体提及。
  2. 我可能还需要更改数据库(如果 Oracle 对 MySQL 用户采取了出人意料的举措),在这种情况下,我需要以某种方式将数据导出到另一个数据库中。在这种情况下(希望不太可能发生的情况)——考虑到分区表,从 MySQL 中转储数据(可能是文本或其他内容)的最佳方法是什么?

【问题讨论】:

  • 即使 Oracle 决定对 mySQL 进行修改,他们也确实无法让开源用户无法使用它。请注意,他们多年来一直在资助 InnoDB 开发。

标签: sql mysql database-design data-modeling database-partitioning


【解决方案1】:

RANGE 分区

按范围分区的表的分区方式是,每个分区都包含分区表达式值位于给定范围内的行。

CREATE TABLE employees (
  school id (integer)
  course_id (integer)
  student_surname (string)
)
  PARTITION BY RANGE (student_surname) (
  PARTITION p0 VALUES LESS THAN ('ezzzzzzzzzzzzzzzzzzzzzzz'),
  PARTITION p1 VALUES LESS THAN ('ozzzzzzzzzzzzzzzzzzzzzzz'),
  PARTITION p2 VALUES LESS THAN ('tzzzzzzzzzzzzzzzzzzzzzzz'),
  PARTITION p3 VALUES LESS THAN (MAXVALUE)
);

Range partitioning

数据迁移到另一个数据库

MySQLDUMP 会将表和数据输出到文件中。但是,Oracle supports connecting to other databases via ODBC,就像 SQL Server 具有它的链接服务器功能一样。

附录

您似乎只按我提到的 3 个字段之一(即名称)进行分区。我在 MySQL 文档中看到了按单个字段进行分区,但没有像我想要的那样按 3 个字段(int、int、string)进行分区。

可以按三列进行分区,但我的示例是根据您在 OP 中的要求:

对于学生的姓氏,它只是姓氏的第一个字符,它决定了数据应该进入哪个“分区表”。

【讨论】:

  • 看起来您只按我提到的 3 个字段之一进行分区(即名称)。我在 MySQL 文档中看到了按单个字段进行分区,但没有像我想要的那样按 3 个字段(int、int、string)进行分区。我正在考虑从 2 个 id 和姓氏的第一个字符动态构建一个字符串,但我不确定这是否有效(或者甚至可以工作)。
  • "我想根据 COMPOSITE 'Key' 对 school_data 表进行分区:"
  • 这个解决方案对我不起作用。我收到一个错误:ERROR 1697 (HY000): VALUES value for partition 'p00' must have type INT 注意:我使用的是 MySQL 5.5,而不是 5.1,但似乎 5.5 也应该支持 varchar 列的范围分区。
【解决方案2】:

如何使用带有 InnoDb 表的 mySQL (5.1) 实现此要求?

查看 MySQL 文档的 Chapter 18. Partitioning,尤其是 Partition Types(我会查看 HASH partitioning)。但请记住,MySQL 5.1 中的分区实现仍在开发中,还有一些limitations and restrictions

我假设从 Windows 迁移到 Linux 时必须转储和恢复数据。如果数据库包含分区表,我不知道这是否可以(指向它在文档中声明的位置的指针会让我放心 - 我无法找到任何关于分区表的转储/恢复的具体提及。

我在18.3 Partition Management 中没有找到任何内容,但是根据this post 的说法,备份和恢复分区表并没有什么特别之处。备份:

mysqldump --opt db_name table_name > file.dump

然后恢复:

mysql db_name < file.dump 

不过我会做一些测试。

我可能还需要更改数据库(如果 Oracle 对 mySQL 用户采取了令人惊讶的举措),在这种情况下,我需要以某种方式将数据导出到另一个数据库中。在这种情况下(希望不太可能发生的情况)——考虑到分区表,从 mySQL 中转储数据(可能是文本或其他内容)的最佳方法是什么?

Oracle SQL Developer 通过包含重新开发的功能并大大扩展原始 Oracle 迁移工作台提供的功能和可用性来将 Microsoft Access、Microsoft SQL Server、MySQL 和 Sybase 数据库迁移到 Oracle,从而整合迁移支持。

【讨论】:

    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多