Лучший способ переместить несколько строк и связанных с ними дочерних строк из одной таблицы в другую. - PullRequest
0 голосов
/ 18 июня 2020
  • Мы предлагаем продукт на основе SAAS, а для базы данных мы используем MYSQL Compatible AWS Aurora 5.7.
  • Чтобы решить проблему большого количества строк в одной таблице, мы создали несколько групп таблиц (g1_, g2_, g3_, et c). В нашем приложении около 350 таблиц, 350 таблиц с префиксом g1_, 350 таблиц с префиксом g2_ и т. Д. клиенты.

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

  1. Решение 1 в нашем уме: Мы можем сохранить идентификатор клиента для каждой таблицы (главной и дочерней) и получить все данные из каждой исходной таблицы по идентификатору клиента и вставить их в соответствующую таблицу для целевой группы.

Проблема: Сопоставление строк дочерней таблицы. Таблицы целевой группы могут иметь существующие строки, а строка основной таблицы исходной группы получит здесь новый идентификатор автоинкремента, поэтому соответствующий сопоставление строк дочерней таблицы было бы невозможно.

Решение 2 в нашем уме: Напишите сценарий, который получит одну строку и вставит ее в целевую таблицу, затем получит связанные строки из таблицы chile, вставьте в целевую дочернюю таблицу, сопоставьте с новым идентификатор автоинкремента и т. д.

Проблема: Этот процесс будет очень медленным с большим набором данных (2,1 миллиона строк)

Пожалуйста, поделитесь своей лучшей идеей или любой инструмент для этого.

Ответы [ 2 ]

0 голосов
/ 29 июня 2020

Почему вы не используете mySQL таблицу разделов в своем предложении, конечно, если бы я мог понять, что вы предлагаете. Я использовал таблицы PARTITION для множества предложений, и у нас есть несколько таблиц с почти 100 миллионами отчетов.

Вот несколько примеров.

Создание таблицы клиентов, разделенной по группам клиентов name:

CREATE TABLE customers (
    id INT NOT NULL,
    name VARCHAR(30),
    customer_group CHAR(10),
    settings JSON, # very useful when you are working with no structured data
    created_at DATETIME
)
PARTITION BY LIST(store_id) (
    PARTITION g1 VALUES IN ('customer1'),
    PARTITION g2 VALUES IN ('customer2'),
    PARTITION g3 VALUES IN ('customer3')
);

Теперь вы можете вставить некоторые данные:

INSERT INTO `customers` VALUES(1, 'Customer 1', 'customer1', '{}', NOW());
INSERT INTO `customers` VALUES(2, 'Customer 2', 'customer2', '{}', NOW());
INSERT INTO `customers` VALUES(3, 'Customer 3', 'customer3', '{}', NOW());

Конечно, если у вас нет большой таблицы с большим количеством результатов, я думаю, что этот пример может быть не очень тебе помочь. Но представьте, что вы хотите добавить данные от другого клиента и не хотите, чтобы эти данные создавали беспорядок для других наших клиентов. Итак, если вы попытаетесь вставить «customer4» в таблицу customers, вы будете заблокированы mySql, для этого вам нужно включить другой раздел следующим образом:

ALTER TABLE `customers` ADD PARTITION (PARTITION `customer4` VALUES IN ('customer4'));

Итак, если вам нужно теперь, чтобы удалить некоторые данные из большой таблицы и передать по параметру только группу клиентов, это займет некоторое время, но, поскольку вы используете таблицы разделов, вы можете просто сделать это.

Если вы хотите удалить все Данные customer4:

ALTER TABLE `customers` TRUNCATE PARTITION `customer4`;

ИЛИ, если вы хотите УБРАТЬ НЕКОТОРЫЕ РАЗДЕЛЫ, такие как customer1 и 3, не затрагивая всю таблицу клиентов:

ALTER TABLE `customers` DROP PARTITION `customer1`,`customer3`;

Если вы хотите сделать свою систему довольно более строго, используя ссылки клиентов в ваших запросах, вы можете использовать имя PARTITION внутри вашего запроса:

SELECT * FROM `customers` PARTITION(`customer2`);

Результатом этого запроса будет простая строка с данными клиента2.

Это несколько простых примеров, которые вы могли бы сделать с таблицами PARTITIONS, я не знаю, вы читали об этом, если я не думаю, что это может быть вариант для вас, в противном случае я думаю, что Я не очень хорошо понимаю вашу проблему, и мне очень жаль. Надеюсь, что это поможет!

Эти дополнительные ссылки

0 голосов
/ 25 июня 2020

Давайте вернемся назад и посмотрим, является ли предложенное решение лучшим.

В общем, разделение одной таблицы (на одном наборе таблиц) на набор идентичных таблиц контрпродуктивно. Это включает в себя изменение кода клиента, чтобы сначала выбрать, какую таблицу, а затем перейти к использованию нужной таблицы. Часто страдает производительность, а не преимущества.

Независимо от подхода, мы не сможем вам помочь, не имея

SHOW CREATE TABLE
and the various queries that would be impacted by the change.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...