MySQL - запрос от ведомого и вставка на ведущем

Раньше я запускал эту команду, чтобы вставить несколько строк в таблицу счетчиков:

insert into `monthly_aggregated_table`
select year(r.created_at), month(r.created_at), count(r.id) from 
raw_items r
group by 1,2;

Этот запрос очень тяжелый и требует некоторого времени для выполнения (миллионы строк), а таблица raw_items — это MyISAM, поэтому она вызывала блокировку таблицы, и записи в нее приходилось ждать завершения вставки.

Теперь я создал подчиненный сервер для выполнения SELECT.

Что я хотел бы сделать, так это выполнить SELECT в ведомом устройстве, но получить результаты и вставить их в основную базу данных. Является ли это возможным? Как? Каков наиболее эффективный способ сделать это? (Раньше во вставке было 1,3 миллиона строк)

Я использую MariaDB 10.0.17.


person Daniel Cukier    schedule 23.03.2015    source источник
comment
Вы можете попробовать федеративные таблицы - SO answer или Вручную. Другой вариант — сбросить данные в текстовый файл и загрузить infile в цель   -  person zedfoxus    schedule 23.03.2015


Ответы (1)


Вам придется разделить действие на 2 части с помощью языка программирования, такого как java или php, между ними.

Сначала выберите, затем загрузите набор результатов в свое приложение, а затем вставьте данные.

Еще одна оптимизация, которую вы могли бы сделать для ускорения выбора, — добавить один новый столбец в вашу таблицу «ym_created_at», содержащий конкатенацию года (created_at) и месяца (created_at). Поместите индекс в этот столбец, а затем запустите обновленный оператор:

insert into `monthly_aggregated_table`
select ym_created_at, count(r.id) from 
raw_items r
group by 1;

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

person Norbert van Nobelen    schedule 23.03.2015