Разделение таблицы базы данных в MySQL - PullRequest
3 голосов
/ 20 декабря 2009

Я пишу хранилище данных, используя MySQL в качестве серверной части. Мне нужно разделить таблицу на основе двух целочисленных идентификаторов и строки имени.

Более конкретный пример - предположить, что я храню данные о школе. Я хочу разделить таблицу school_data на основе КОМПОЗИТА 'Ключ' на основе следующего:

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

Что касается фамилии студента, то это только первый символ фамилии, который определяет, в какую «секционированную таблицу» должны поступать данные.

Как я могу реализовать это требование, используя MySQL (5.1) с таблицами InnoDb?

Кроме того, я занимаюсь разработкой на Windows-боксе, но я буду развертывать на * nix-боксе для производства. У меня есть еще два вопроса:

  1. Я предполагаю, что мне придется сбрасывать и восстанавливать данные при переходе с Windows на Linux. Я не знаю, нормально ли это, если база данных содержит многораздельные таблицы (указатель на то, где это указано в документации, остановит мой разум - я не смог найти никакого конкретного упоминания о дампе / восстановлении относительно многораздельных таблиц.
  2. Мне также может потребоваться изменить базы данных (если Oracle неожиданно потянет пользователей MySQL), и в этом случае мне потребуется SOMEHOW экспортировать данные в другую базу данных. В этом (мы надеемся, маловероятном сценарии) - каков будет лучший способ выгрузить данные из MySQL (может быть, в текст или что-то еще), принимая во внимание разделенную таблицу?

Ответы [ 2 ]

4 голосов
/ 20 декабря 2009

RANGE Partitioning

Таблица, которая разделена по диапазону, разделена таким образом, что каждый раздел содержит строки, для которых значение выражения разделения находится в заданном диапазоне.

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)
);

Диапазон разделения

Перенос данных в другую БД

MySQLDUMP выведет таблицу и данные в файл. Тем не менее, Oracle поддерживает подключение к другим базам данных через ODBC , так же как SQL Server имеет возможности связанного сервера.

Добавление

Похоже, что вы разделяете только одно из 3 полей, которые я упомянул (т.е. имя). Я видел разделение по одному полю в документации MySQL, но не по 3 полям (int, int, string), как я хочу.

Возможно разбиение на три столбца, но мой пример соответствует вашим требованиям в OP:

Для фамилии студента это просто первый символ фамилии, который определяет, к какой «секционированной таблице» должны поступать данные.

3 голосов
/ 20 декабря 2009

Как я могу реализовать это требование, используя mySQL (5.1) с таблицами InnoDb?

Взгляните на Глава 18. Разделение документации MySQL и особенно Типы разделов (я бы посмотрел на HASH разбиение ) , Но имейте в виду, что реализация секционирования в MySQL 5.1 все еще находится в стадии разработки, и есть некоторые ограничения и ограничения .

Я предполагаю, что мне придется сбрасывать и восстанавливать данные при переходе с Windows на Linux. Я не знаю, нормально ли это, если БД содержит многораздельные таблицы (указатель на то, где это указано в документации, заставит меня задуматься - я не смог найти никакого конкретного упоминания о дампе / восстановлении в отношении многораздельных таблиц.

Я ничего не нашел в 18.3 Partition Management , но, согласно этой записи , резервное копирование и восстановление секционированной таблицы не представляет собой ничего особенного. Для резервного копирования:

mysqldump --opt db_name table_name > file.dump

И восстановить:

mysql db_name < file.dump 

Я бы все-таки попробовал.

Мне также может понадобиться изменить базы данных (если Oracle использует неожиданный ход для пользователей mySQL), и в этом случае мне потребуется SOMEHOW экспортировать данные в другую базу данных. В этом (возможно, маловероятном сценарии) - каков будет лучший способ выгрузить данные из mySQL (может быть, в текст или что-то еще), принимая во внимание разделенную таблицу?

Oracle SQL Developer включает поддержку миграции, включая переработанные функции и значительно расширяя функциональность и удобство использования, предлагаемые исходным Oracle Migration Workbench, для миграции баз данных Microsoft Access, Microsoft SQL Server, MySQL и Sybase на Oracle.

...