Najszybszy sposób na skopiowanie tabeli w mysql?

82

Chcę skopiować tabelę do MySQL. Jaki jest najszybszy sposób? Lubię to?

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

lub

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

czy jest inny sposób?

EDYCJA: Martwię się o ponowne utworzenie indeksów, w jaki sposób mysql wykonuje te instrukcje?

PS. nie może używać narzędzi wiersza poleceń, takich jak mysqldump, musi działać w locie.

Zaraz
źródło

Odpowiedzi:

50

Spowoduje to natychmiastowe skopiowanie struktury tabeli, ale nie danych:

CREATE TABLE copy LIKE original;

Spowoduje to utworzenie wszystkich indeksów, które originalmiała tabela.

Działa to w ten sposób w mysql 5.1.39.

ceteras
źródło
3
Ale nie skopiuje wyzwalaczy.
ursitesion
3
Uwaga, to również nie spowoduje skopiowania ograniczeń kluczy obcych.
Omer Sabic
47

Najszybszym sposobem korzystania z tabel MyISAM przy zachowaniu indeksów ) i być może innych silników pamięci masowej jest:

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

Chcesz wyłączyć klucze do ładowania bazy danych, a następnie ponownie utworzyć klucze na końcu.

Podobnie w przypadku InnoDB :

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

(Jak wskazano w komentarzach.)

brązowy
źródło
1
Dziwne. INSERT z kluczami zajęło 36 minut, a ta metoda zajęła 10 + 26 minut (insert + alter). 6 indeksów, 28 M rekordów, Win 7 x64, 8 GB RAM.
Per Lindberg
WŁĄCZENIE KLAWISZY powoduje wyświetlenie „tabeli napraw”. Sprawdź swoją listę procesów, w jaki sposób to się dzieje. Istnieją dwa rodzaje: 1. tabela napraw z pamięcią podręczną 2. tabela napraw przez sortowanie Druga, jeśli jest to metoda szybka i będzie używana tylko wtedy, gdy wartość myisam_max_sort_file_size jest wystarczająco duża. dev.mysql.com/doc/refman/5.7/en/repair-table-speed.html
lopo
ALTER TABLE table DISABLE/ENABLE KEYSnie działa w InnoDB i daje poniższe ostrzeżenie Table storage engine for 'table' doesn't have this option.
Amil Waduwawara
1
dla innodb użyj tutaj SET unique_checks=0; SET foreign_key_checks=0;wstaw kod sqlSET unique_checks=1; SET foreign_key_checks=1;
tuku
13

Z instrukcji :

„CREATE TABLE ... SELECT nie tworzy automatycznie żadnych indeksów dla Ciebie. Jest to robione celowo, aby instrukcja była jak najbardziej elastyczna. Jeśli chcesz mieć indeksy w utworzonej tabeli, powinieneś określić je przed instrukcją SELECT:”

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

Możesz określić indeksy i typy danych (aby uniknąć konwersji typów danych) w zarówno CREATE TABLE LIKEi CREATE TABLE SELECT. Który z nich jest szybszy, zależy od konfiguracji.

dnagirl
źródło
9

Aby skopiować z indeksami i wyzwalaczami, wykonaj następujące 2 zapytania:

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

Aby skopiować tylko strukturę i dane, użyj tego:

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;
Zigri2612
źródło
Nie powinno być INSERT INTOzamiast INSERT?
giordano
6

Czy create table mynewtable (select * from myoldtable)działa w mysql? Jeśli tak, to też możesz spróbować.

Draco Ater
źródło
5

Najlepszym sposobem na skopiowanie struktury i wszystkich wpisów z jednej tabeli do drugiej (poprzez utworzenie nowej tabeli) jest to zapytanie ...

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

Anil Chahal
źródło
3

Spróbuj SELECT INTOi użyj zmiennej jako pośrednika.

Najpierw musisz utworzyć tabelę odbiorczą, aby miała taką samą strukturę jak tabela źródłowa.

Najlepsze jest to, że jest wewnętrzny, więc jest szybki. Jednak stracisz swoje indeksy.

amfetamachina
źródło
Funkcja Select into nie jest obsługiwana przez mySQL
Draco Ater
@Draco Ater - Tak, to prawda. Po prostu używa zmiennych.
amfetamachine
2
Czy możesz podać przykład? Bo myślę, że zmienne będą po prostu przechowywać ostatnią wartość odczytaną przez select, ale nie wszystkie wartości w tabeli. Dopóki nie używasz kursora i nie chcesz kopiować tabel z więcej niż jednym wierszem, to rozwiązanie w ogóle nie działa.
fancyPants
2

jeśli używasz MyISAM, możesz także kopiować i zmieniać nazwy poszczególnych plików. Pliki .MYD, .MYI, .FRM na zapleczu

Aravind
źródło
1

Może mógłbyś rzucić okiem SHOW CREATE TABLE.

Kroki do podjęcia:

  • Przejdź do phpmyadmin

  • Przejdź do SQL

Wykonaj to zapytanie

SHOW CREATE TABLE `the_old_table`;
  • Kliknij opcje Zaznacz „Pełne teksty” i naciśnij Przejdź.

Wynikiem jest pełna instrukcja CREATE TABLE. Edytuj zapytanie, aż będziesz zadowolony.

Zasób: http://dev.mysql.com/doc/refman/5.7/en/show-create-table.html

juliański
źródło
0
CREATE TABLE copy SELECT * FROM original;

Jest to szybki sposób, ale może nie najszybsza przyczyna indeksowania.

Thor
źródło
Zmień swoją odpowiedź i sformatuj ją poprawnie, aby była czytelna.
Neeku
1
Ta instrukcja nie kopiuje indeksów ani wyzwalaczy skojarzonych z tą tabelą.
ursitesion