Самый быстрый способ скопировать таблицу в MySQL?

82

Я хочу скопировать таблицу в MySQL. Какой способ самый быстрый? Как это?

CREATE TABLE copy LIKE original;
INSERT INTO copy SELECT * FROM original;

или же

CREATE TABLE copy SELECT * FROM original;
ALTER TABLE copy ADD PRIMARY KEY (id);

или есть другой способ?

РЕДАКТИРОВАТЬ: меня беспокоит воссоздание индексов, как mysql выполняет эти инструкции?

PS. не могут использовать инструменты командной строки, такие как mysqldump, должны работать «на лету».

Анон
источник

Ответы:

50

Это немедленно копирует структуру таблицы, но не данные:

CREATE TABLE copy LIKE original;

Это создает все индексы, которые были в originalтаблице.

Так работает в mysql 5.1.39.

Ceteras
источник
3
Но он не будет копировать триггеры.
ursitesion
3
Обратите внимание, что это также не будет копировать ограничения внешних ключей.
Омер Сабич
47

Самый быстрый способ использования таблиц MyISAM при сохранении индексов ) и, возможно, других механизмов хранения:

CREATE TABLE copy LIKE original;
ALTER TABLE copy DISABLE KEYS;
INSERT INTO copy SELECT * FROM original;
ALTER TABLE copy ENABLE KEYS;

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

Аналогично для InnoDB :

SET unique_checks=0; SET foreign_key_checks=0; 
..insert sql code here..
SET unique_checks=1; SET foreign_key_checks=1;

(Как указано в комментариях.)

ctbrown
источник
1
Странный. INSERT с ключами занял 36 минут, а этот метод занял 10 + 26 минут (insert + alter). 6 индексов, 28 M записей, Win 7 x64, 8 ГБ ОЗУ.
Пер Линдберг,
РАЗРЕШЕНИЕ КЛЮЧЕЙ вызывает "таблицу ремонта". Проверьте свой список процессов, каким образом это происходит. Есть два вида: 1. таблица восстановления с помощью кэша ключей 2. таблица восстановления путем сортировки. Вторая таблица, если путь быстрый и будет использоваться, только если myisam_max_sort_file_size достаточно большой. dev.mysql.com/doc/refman/5.7/en/repair-table-speed.html
lopo
ALTER TABLE table DISABLE/ENABLE KEYSне работает в InnoDB и дает предупреждение ниже Table storage engine for 'table' doesn't have this option.
Амил Вадувавара 02
1
для innodb используйте SET unique_checks=0; SET foreign_key_checks=0;здесь код sqlSET unique_checks=1; SET foreign_key_checks=1;
tuku
13

Из руководства :

«CREATE TABLE ... SELECT не создает для вас автоматически никаких индексов. Это сделано намеренно, чтобы сделать оператор максимально гибким. Если вы хотите иметь индексы в созданной таблице, вы должны указать их перед оператором SELECT:»

CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;

Вы можете указать индексы и типы данных (чтобы избежать преобразования типов данных) в обоих CREATE TABLE LIKEи CREATE TABLE SELECT. Какой из них быстрее, будет зависеть от вашей настройки.

dnagirl
источник
9

Для копирования с индексами и триггерами выполните эти 2 запроса:

CREATE TABLE newtable LIKE oldtable; 
INSERT newtable SELECT * FROM oldtable;

Чтобы скопировать только структуру и данные, используйте это:

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;
Зигри2612
источник
Не должно быть INSERT INTOвместо INSERT?
giordano 05
6

Работает ли create table mynewtable (select * from myoldtable)в MySQL? Если да, вы тоже можете попробовать.

Драко Атер
источник
5

Лучший способ скопировать структуру и все записи из одной таблицы в другую (создав новую таблицу) - это запрос ...

CREATE TABLE new_table LIKE old_table; INSERT new_table SELECT * FROM old_table;

Анил Чахал
источник
3

Попробуйте SELECT INTOиспользовать переменную как посредник.

Сначала вам нужно создать принимающую таблицу, которая должна иметь ту же структуру, что и исходная таблица.

Лучше всего то, что он внутренний, поэтому он быстрый. Однако вы потеряете свои индексы.

амфетамашина
источник
Select into не поддерживается mySQL
Драко Атер
@ Драко Атер - Да, это так. Он просто использует переменные.
amphetamachine
2
Вы можете привести пример? Потому что я думаю, что переменные будут просто содержать последнее значение, которое было прочитано выбором, но не все значения в таблице. Пока вы не используете курсор и не хотите копировать таблицы с более чем одной строкой, это решение вообще не работает.
fancyPants 06
2

если вы используете MyISAM, вы также можете копировать и переименовывать индивидуальные файлы. Файлы .MYD, .MYI, .FRM в серверной части

Аравинд
источник
1

Может ты мог бы взглянуть на SHOW CREATE TABLE .

Что нужно сделать:

  • Зайдите в phpmyadmin

  • Перейти к SQL

Выполнить этот запрос

SHOW CREATE TABLE `the_old_table`;
  • Щелкните параметры. Отметьте «Полный текст» и нажмите «Перейти».

Результатом является полный оператор CREATE TABLE. Отредактируйте запрос, пока не будете довольны.

Ресурс: http://dev.mysql.com/doc/refman/5.7/en/show-create-table.html

Юлиан
источник
0
CREATE TABLE copy SELECT * FROM original;

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

Тор
источник
Пожалуйста, отредактируйте свой ответ и отформатируйте его, чтобы он был удобочитаемым.
Neeku
1
Этот оператор не копирует индексы или триггеры, связанные с этой таблицей.
ursitesion