Mysql'de bir tabloyu kopyalamanın en hızlı yolu?


82

MySQL'de bir tablo kopyalamak istiyorum. En hızlı yol nedir? Bunun gibi?

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

veya

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

Ya da başka bir yol var mı?

DÜZENLEME: Yeniden oluşturulan dizinler hakkında endişeliyim, mysql bu ifadeleri yürütmeye nasıl devam ediyor?

PS. mysqldump gibi komut satırı araçlarını kullanamazsınız, anında olmalıdır.

Yanıtlar:


50

Bu, tablonun yapısını hemen kopyalar, ancak verileri kopyalamaz:

CREATE TABLE copy LIKE original;

Bu, originaltablonun sahip olduğu tüm dizinleri oluşturur .

Mysql'de bu şekilde çalışır 5.1.39.


3
Ancak, tetikleyicileri kopyalamayacaktır.
ursitesion

3
Unutmayın, bu ayrıca yabancı anahtar kısıtlamalarını kopyalamayacaktır.
Omer Sabic

47

Dizinleri korurken MyISAM tablolarını kullanmanın en hızlı yolu ) ve belki diğer depolama motorları:

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

Veritabanı yüklemeniz için anahtarlarınızı devre dışı bırakmak ve ardından sonunda anahtarları yeniden oluşturmak istiyorsunuz.

Benzer şekilde InnoDB için :

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

(Yorumlarda belirtildiği gibi.)


1
Garip. INSERT tuşlarıyla 36 dakika sürdü ve bu yöntem 10 + 26 dakika sürdü (ekle + değiştir). 6 dizin, 28 M kayıt, Win 7 x64, 8GB RAM.
Başına Lindberg

ETKİNLEŞTİRME TUŞLARI bir "onarım tablosuna" neden olur. İşlem listenizi bunun hangi şekilde gerçekleştiğini kontrol edin. İki tür vardır: 1. anahtar önbelleği ile tabloyu onarın 2. sıralayarak tabloyu onarın İkincisi oruçluysa ve yalnızca myisam_max_sort_file_size yeterince büyükse kullanılacaktır. dev.mysql.com/doc/refman/5.7/en/repair-table-speed.html
lopo

ALTER TABLE table DISABLE/ENABLE KEYSInnoDB'de çalışmaz ve aşağıdaki uyarı verir Table storage engine for 'table' doesn't have this option.
Amil Waduwawara

1
innodb kullanımı için SET unique_checks=0; SET foreign_key_checks=0;sql kodunu buraya girinSET unique_checks=1; SET foreign_key_checks=1;
tuku

13

Gönderen manuel :

"CREATE TABLE ... SELECT sizin için otomatik olarak herhangi bir dizin oluşturmaz. Bu, ifadeyi olabildiğince esnek hale getirmek için bilinçli olarak yapılır. Oluşturulan tabloda dizinlere sahip olmak istiyorsanız, bunları SELECT ifadesinden önce belirtmelisiniz:"

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

Hem CREATE TABLE LIKEve hem de CREATE TABLE SELECT. Hangisinin daha hızlı olduğu, kurulumunuza bağlı olacaktır.


9

Dizinler ve tetikleyicilerle kopyalamak için şu 2 sorguyu yapın:

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

Sadece yapıyı ve verileri kopyalamak için şunu kullanın:

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

Olmamalı INSERT INTOyerine INSERT?
giordano

6

Mysql'de create table mynewtable (select * from myoldtable)çalışıyor mu ? Eğer öyleyse siz de deneyebilirsiniz.


5

Yapıyı ve tüm girişleri bir tablodan başka bir tabloya kopyalamanın en iyi yolu (yeni tablo oluşturarak) bu sorgudur ...

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


3

SELECT INTOBir değişken olarak deneyin ve kullanın .

Kaynak tablo ile aynı yapıya sahip olmak için önce alıcı tabloyu oluşturmanız gerekir.

En iyi şey, içsel olması, yani hızlı olmasıdır. Yine de indekslerinizi kaybedeceksiniz.


İçine seçme, mySQL tarafından desteklenmiyor
Draco Ater

@Draco Ater - Evet, öyle. Sadece değişkenleri kullanır.
amphetamachine

2
Bir örnek verebilir misiniz? Bence, değişkenler sadece select tarafından okunan son değeri tutacak, ancak tablodaki tüm değerleri tutmayacaktır. İmleç kullanmadığınız ve birden fazla satır içeren tabloları kopyalamak istemediğiniz sürece bu çözüm hiç çalışmaz.
fancyPants

2

MyISAM kullanıyorsanız, aynı zamanda ikili dosyaları kopyalayabilir ve yeniden adlandırabilirsiniz. Arka uçtaki .MYD, .MYI, .FRM dosyaları


1

Belki bir bakabilirsin SHOW CREATE TABLE.

Atılacak adımlar:

  • Phpmyadmin'e git

  • SQL'e git

Bu sorguyu yürütün

SHOW CREATE TABLE `the_old_table`;
  • Seçenekleri tıklayın "Tam metinler" i işaretleyin ve Git'e basın.

Sonuç, tam bir CREATE TABLE ifadesidir. Mutlu olana kadar sorguyu düzenleyin.

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


0
CREATE TABLE copy SELECT * FROM original;

Hızlı bir yoldur, ancak dizinlerin en hızlı nedeni olmayabilir.


Lütfen cevabınızı düzenleyin ve okunabilir hale getirmek için doğru şekilde biçimlendirin.
Neeku

1
Bu ifade ne dizinleri ne de bu tabloyla ilişkili tetikleyicileri kopyalar.
ursitesion
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.