在MySQL中对数据库表进行分区

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

一个更具体的例子是假设我正在存储有关学校的数据.我想根据COMPOSITE’Key’对school_data表进行分区,具体如下:

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

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

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

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

>我假设在从Windows迁移到Linux时我必须转储和恢复数据.我不知道如果数据库包含分区表是否可以(指向它在文档中指出这一点的指针将让我放心 – 我无法找到有关分区表的转储/恢复的任何具体提及.
>我可能还需要更改数据库(如果Oracle对MySQL用户采取了意外行动),在这种情况下,我需要将数据导出到另一个数据库中.在这个(希望不太可能的场景) – 什么是最好的方式从MySQL转储数据(可能是文本或东西),同时考虑到分区表?

最佳答案
范围分区

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

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具有链接服务器功能一样.

附录

It looks like you are partitioning by only one of the 3 fields I mentioned (i.e. name). I saw partitioning by a single field in the MySQL docs, but not 3 fields (int, int, string) like I want to do.

可以通过三列进行分区,但我的示例符合OP中的要求:

For the student surname, it just the first character of the surname that determines which ‘partitioned table’ the data should go in to.

转载注明原文:在MySQL中对数据库表进行分区 - 代码日志