Neden hiç ALGORİTMA = ALGORİTMA KOPYALAMA = TESPİT'i tercih ederim?


16

MySQL 5.6 çevrimiçi DDL'yi tanıttığından, ALTER TABLEkomut isteğe bağlı olarak ALGORITHM=INPLACEveya ALGORITHM=COPYbelirtilmiş olabilir. Online DDL genel bakış varsayılan olarak, bu notlar INPLACEmümkün olan her yerde kullanılır ve ima ki (hiç oldukça bunu belirtmeden) INPLACEalgoritması daha ucuzdur COPYbiridir.

Peki ALGORITHM=COPYbir ALTER TABLEifadede ne gibi bir sebep belirtmem gerekirdi ?


COPY kullanırsanız, tablodaki dizinlere ne olur? Yeni bir tablo oluşturulduğundan ve sıfırdan doldurulduğundan dolayı birleştirilmiş dizinlerle sonuçlanıyor musunuz?
Dave Poole

COPY sıfırdan doldurulursa, yavaş bir seçenek olsa da, sonuçta ortaya çıkan tablo birleştirilmiş dizinler nedeniyle daha iyi performans gösterebilir.
Dave Poole

@DavePoole Güzel bir teori, ancak MySQL 5.7.4 itibariyle ( OPTIMIZE TABLEendeksleri amacının büyük bir parçası olarak birleştirdiğine inanıyorum ) kullandığından beri işaretin dışında olduğundan şüpheleniyorum ALGORITHM=INPLACE. Bence Bu yüzden, evet, durum COPY yok dolandırmak endeksleri, ama yaparINPLACE potansiyel bir avantaj olarak sıfırlanmasını, (her nasılsa) COPY.
Mark Amery

2
"MySQL 5.6'dan önce oluşturulan InnoDB tabloları ALTER TABLE ... ALGORITHM=INPLACE, geçici sütunlar (DATE, DATETIME veya TIMESTAMP) içeren tabloları desteklemez ve ALTER TABLE ... ALGORITHM=COPY" ... Çevrimiçi
DDL'nin

Yanıtlar:


10

Evet, belirtebileceğiniz durumlar vardır COPY, ancak performanstan başka nedenlerle olabilir.

MySQL'in yeni bir özellik getirdiğini anlamak önemlidir - 5.6 sürümünde Çevrimiçi DLL işleme. Çevrimdışı işleme kaldırılmadı. Bu nedenle, bu 2 mod arasında ayrım yapmaya ihtiyaç vardır:

  1. Bazı işlemler yalnızca Çevrimdışı modda çalışır. Yerinde gerçekleştirilebilen veya gerçekleştirilemeyen DDL işlemlerinin listesi için bkz. Tablo 15.10, “ DDL İşlemleri için Çevrimiçi Durumun Özeti ”.

  2. Çevrimiçi ve Çevrimdışı modlardaki işlemler biraz farklı davranışlara sahiptir, bu nedenle uyumluluk nedeniyle "eski" olanı seçebilirsiniz.

Bazı örnekler (lütfen daha fazla önerin):

  1. MySQL 5.6 önce oluşturulmuş InnoDB tablolar desteklemeyen ALTER TABLE ... ALGORITHM=INPLACEzamansal sütunları (dahil tablolar için DATE, DATETIMEya da TIMESTAMP) kullanarak yeniden edilmemiştir ALTER TABLE ... ALGORITHM=COPY. Bu durumda, bir ALTER TABLE ... ALGORITHM=INPLACEişlem hata döndürür.

  2. ADD PRIMARY KEYcümlesi COPY modesessizce NULLo veri türü için varsayılan değerlere (INT için 0, varchar için boş dize) dönüştürürken IN_PLACEbunu yapmaz.

ALGORITHM = COPY yan tümcesinde, birincil anahtar sütunlarında NULL değerlerinin bulunmasına rağmen işlem başarılı olur; veriler sessizce değiştirilir, bu da sorunlara neden olabilir.

Tercih etmek için başka bir neden COPY:

Özel senaryolarda tam geriye dönük uyumluluk için gerekirse tablo kopyalama davranışını zorlamak üzere ALGORITHM = COPY veya old_alter_table = 1 belirttiğiniz işlemler.

MySQL kılavuzu gerçek senaryolar hakkında konuşmasa da, bazılarını hayal edebilirsiniz. Örneğin, geliştirici ALTER INDEXçalışma sırasında tablonun kilitlenmesine güveniyordu, bu nedenle tablonun salt okunur veya tamamen kilitli olması ve dizin yeniden oluşturma sırasında statik tabloyu okuyan bir işlem var.


1
Bence insanlar ALGORITHM=INPLACEaslında "Bu Çevrimiçi DDL ve veritabanını kilitlemeyecek" ile karıştırmaya eğilimlidirler , aslında kullanmak istedikleri zaman LOCK=NONE.
Brendan Byrd

2

@Stoleg muhtemelen en iyi cevaba sahiptir, ancak işte başka bir cevap. =COPYCiddi bir hata olması durumunda geliştiricilerin bir kaçış kapağı olarak bıraktıkları eğitimli bir tahmin =INLINE. Bu, kullanıcıların ALTERyeni özellik bozulsa bile kullanmaya devam etmelerini sağlar .

Yıllar boyunca (bayraklar sql_mode, my.cnfortamlar, vb.) Böyle şeyler gördüm . Yeni sürümün amacı, yeni, daha iyi özelliği ortaya çıkarmaktır.

Optimizasyon bayrakları bu kategoriye girer, ancak önceki işlemlere devam etmek için daha da fazla neden vardır - Optimizer bazen "yanlış yapar"; çok fazla olasılık var.


1
Neden "geriye dönük uyumluluk" yerine "kaçış kapağı" olarak adlandırıyorsunuz? Çok fark olmamasına rağmen;)
Stoleg

1
Ben her iki sürümünde çalıştırmak için aynı kodu gerekiyorsa "geriye uyumluluk" söyleyebilirim. Ama sonra yeni sözdiziminin eski sürüm tarafından tanınıp tanınmadığından endişe ediyorum.
Rick James

-1

InnoDB tablo alanı şifrelemesini destekleyen MySQL sürümlerinde, şifreleme eklemek için bir tabloyu değiştirdiğinizde, değiştirme işlemi zorunlu olarak kopyalama algoritması kullanılarak yapılır.

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.