2016-04-09 4 views
0

У меня относительно дорогостоящий процесс, который требует «самостоятельного объединения», которое забивает мое время вычисления. Рассмотрим следующий сценарий:MySQL эффективное дублирование таблицы

CREATE TEMPORARY TABLE tempdb.table1 
SELECT * FROM db.sometable WHERE {condition}; 
ALTER TABLE tempdb.table1 ADD INDEX idx_t({columns for join}); 

CREATE TEMPORARY TABLE tempdb.table2 
SELECT * FROM tempdb.table1; 
ALTER TABLE tempdb.table2 ADD INDEX idx_t({columns for join}); 

В этом случае мне необходимо вычислить индекс дважды, прежде чем я смогу попробовать присоединиться. Если я создам вторую таблицу с помощью оператора «LIKE», новая таблица будет создана с помощью структуры индексов, но все равно будет обрабатываться во время заполнения таблицы.

Есть ли способ полностью дублировать таблицу, индексы и все за один шаг? Это значительно сократило бы время вычисления, поскольку ему просто нужно было бы найти память для этой новой таблицы, а не для реорганизации большого количества вычислений. Как упоминалось в комментариях, это проблема, с которой я регулярно сталкиваюсь для различных приложений. Моя цель с этим вопросом заключается не в оптимизации конкретного приложения, а в получении информации об этой проблеме в целом.

+1

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

+0

@GordonLinoff Это проблема, с которой я сталкиваюсь часто, независимо от точного контекста. Поэтому меня больше интересует этот вопрос, чем некоторые общие подходы к оптимизации. – jameselmore

+0

@jamesselmore. , , Интересно. Мне почти никогда не нужно создавать временные таблицы для оптимизации запросов. –

ответ

0

Создайте таблицу, используя оператор «LIKE», как вы уже упоминали. Затем отключите индексы перед копированием данных из исходной таблицы. Что-то вроде этого:

CREATE TABLE destdb.table1 LIKE srcdb.table1; 
ALTER TABLE destdb.table1 DISABLE KEYS; 
INSERT INTO destdb.table1 SELECT * FROM srcdb.table1; 
ALTER TABLE destdb.table1 ENABLE KEYS; 
+0

Когда я буду повторно использовать ключи, вам не нужно все еще перерабатывать? Не ясно, что это решает проблему так же, как разбивает ее на два разных этапа. – jameselmore

+0

Повторное включение индекса приведет к созданию данных индекса. Вы не можете этого избежать, но, отключив индекс перед вставкой, вы получите лучшую производительность. Вставка будет быстрее, потому что не нужно обновлять индекс для каждой вставки. Если ваша таблица имеет внешние ключи, вы также можете отключить внешние ключи и получить лучшую производительность. – gmarintes

+0

Хорошо, но как это отличается от того, что я написал выше? Где я пишу во вторую таблицу, а затем применяю индексы – jameselmore