2011-01-26 3 views
1

Мне нужно создать таблицу на основе другой таблицы в MYsql, включая ограничения и индексы.Mysql создать таблицу на основе другой таблицы, включая индексы

У меня есть следующий сценарий:

Таблица A- существует, вероятно, с миллионами строк. Я хочу создать таблицу B точно так же, как и таблицу A (включая ограничения и индексы). Данные процесса из A и некоторых других источников и вставка в B. В конце таблицы обработки A (индексы падения, связанные с таблицей A) и переименовать таблицу B в A, включая индексы.

Каков наилучший способ для этого? Производительность - моя настоящая забота.

Благодаря

ответ

1

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

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

Ваш «какой-то другой источник» является подстановочные. Я предполагаю, что вы не знаете, если этот другой источник содержит достоверные данные, и хотел бы предложить:

1) Создание B без ограничений или Индексы

2) Копирование/вставка основная из «другого источника» к B

3) Выполнение ограничений путем выдачи SELECT, чтобы найти недопустимые строки. Пропустите этот шаг, если вы знаете, что данные действительны. Как только это будет нормально:

4) Скопируйте A в B в «куски». Проблема здесь в том, что прямой SELECT ... INTO ... из всех X миллионов строк будет навсегда (из-за взрыва ресурсов, необходимых для выполнения в одной подразумеваемой транзакции), но строка за строкой также будет принять навсегда (потому что его просто медленно делать по одной строке за раз). Таким образом, вы обрабатываете фрагменты по 1000 или 10000 строк за раз.

5) Когда все данные копируются, добавьте индексов

6) Добавить ограничения

7) Drop A

8) Переименовать B

+0

'CREATE TABLE ... LIKE oldtable' может пригодиться здесь, хотя он скопирует определения индексов. –

+1

Спасибо Marc, я, вероятно, пользуюсь LIKE, моя нерешительность объясняется следующим описанием инструкции LIKE .. CREATE TABLE ... LIKE не сохраняет никаких параметров таблицы DATA DIRECTORY или INDEX DIRECTORY, которые были указаны для исходной таблицы, или любых определений внешнего ключа. В настоящее время у меня нет внешнего ключа в таблице, поэтому я, вероятно, займусь этим. @Ken, я не могу сделать так, как вы предложили, поскольку мне нужно обрабатывать содержимое исходной таблицы с новыми данными одновременно. – Mahesh