Найшвидший спосіб скопіювати таблицю в 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);

чи є інший спосіб?

EDIT: Мене турбує повторне створення індексів, як mysql продовжує виконувати ці оператори?

PS. не може використовувати інструменти командного рядка, як mysqldump, повинен бути на льоту.

Відповіді:


50

Це негайно копіює структуру таблиці, але не дані:

CREATE TABLE copy LIKE original;

Це створює всі індекси, що були в originalтаблиці.

Це працює таким чином у mysql 5.1.39.


3
Але це не буде копіювати тригери.
ursitesion

3
Зауважте, це також не буде копіювати обмеження зовнішніх ключів.
Omer Sabic

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;

(Як зазначено в коментарях.)


1
Дивно. ВСТАВКА з ключами займала 36 хв, а цей спосіб - 10 + 26 хв (вставка + зміна). 6 індексів, 28 мільйонів записів, Win 7 x64, 8 ГБ оперативної пам'яті.
Пер Ліндберг,

КНОПКИ ENABLE викликають "таблицю ремонту". Перевірте свій список процесів, яким чином це відбувається. Існує два типи: 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.
Amil Waduwawara 02

1
для innodb використовуйте тут SET unique_checks=0; SET foreign_key_checks=0;вставте код sqlSET unique_checks=1; SET foreign_key_checks=1;
tuku

13

З посібника :

"СТВОРИТИ ТАБЛИЦЮ ... SELECT не створює для вас автоматично жодних індексів. Це робиться навмисно, щоб зробити оператор максимально гнучким. Якщо ви хочете мати індекси у створеній таблиці, вам слід вказати їх перед оператором SELECT:"

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

Ви можете вказати індекси та типи даних (щоб уникнути перетворення типів даних) як за допомогою, так CREATE TABLE LIKEі для CREATE TABLE SELECT. Який з них швидший, залежатиме від вашої установки.


9

Для копіювання за допомогою індексів та тригерів виконайте ці 2 запити:

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

Щоб скопіювати лише структуру та дані, скористайтеся цим:

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

Не повинно бути INSERT INTOзамість INSERT?
giordano

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і використовуйте змінну як посередник.

По-перше, вам доведеться створити приймальну таблицю, щоб мати таку ж структуру, що і вихідна таблиця.

Найкраще, це внутрішній, тому швидкий. Однак ви втратите свої індекси.


Вибір в не підтримується MySQL
Draco Ater

@Draco Ater - Так, так. Він просто використовує змінні.
амфетамахін

2
Можете навести приклад? Тому що я думаю, що змінні просто містять останнє значення, прочитане select, але не всі значення в таблиці. Поки ви не використовуєте курсор і не хочете копіювати таблиці з більш ніж одним рядком, це рішення взагалі не працює.
fancyPants

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;

Це швидкий спосіб, але, можливо, не найшвидша причина індексів.


Будь ласка, відредагуйте свою відповідь та відформатуйте її належним чином, щоб зробити її читабельною.
Ніку

1
Цей оператор не копіює індекси та тригери, пов'язані з цією таблицею.
ursitesion
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.