Sejak MySQL 5.6 memperkenalkan DDL online, ALTER TABLE
perintah opsional dapat memiliki ALGORITHM=INPLACE
atau ALGORITHM=COPY
ditentukan. The gambaran DDL secara online catatan bahwa, secara default, INPLACE
yang digunakan sedapat mungkin, dan menyiratkan (tanpa pernah cukup yang menyatakan itu) bahwa INPLACE
algoritma lebih murah daripada COPY
satu.
Jadi alasan apa yang harus saya tentukan ALGORITHM=COPY
pada ALTER TABLE
pernyataan?
mysql
alter-table
ddl
online-operations
Mark Amery
sumber
sumber
OPTIMIZE TABLE
(yang saya percaya memiliki defragging indeks sebagai bagian besar dari tujuannya ) menggunakanALGORITHM=INPLACE
MySQL 5.7.4. Jadi saya pikir itu adalah kasus yang, ya,COPY
melakukan defrag indeks, tetapi demikian jugaINPLACE
(entah bagaimana), membatalkannya sebagai potensi keuntunganCOPY
.ALTER TABLE ... ALGORITHM=INPLACE
untuk tabel yang menyertakan kolom temporal (DATE, DATETIME atau TIMESTAMP) dan belum dibangun kembali menggunakanALTER TABLE ... ALGORITHM=COPY
" ... Keterbatasan DDL OnlineJawaban:
Ya, ada beberapa kasus ketika Anda dapat menentukan
COPY
, tetapi itu karena alasan lain selain kinerja.Penting untuk dipahami bahwa MySQL memperkenalkan fitur baru - Pemrosesan DLL online dalam versi 5.6. Itu tidak menghapus pemrosesan offline. Jadi ada kebutuhan untuk membedakan antara 2 mode ini:
Beberapa operasi masih berfungsi dalam mode Offline saja. Lihat Tabel 15.10, “ Ringkasan Status Online untuk Operasi DDL ” untuk daftar operasi DDL yang dapat atau tidak dapat dilakukan di tempat.
Operasi dalam mode Online dan Offline memiliki perilaku yang sedikit berbeda, sehingga Anda dapat memilih "lama" untuk alasan kompatibilitas.
Beberapa contoh (harap sarankan lebih banyak):
Tabel InnoDB dibuat sebelum MySQL 5.6 tidak mendukung
ALTER TABLE ... ALGORITHM=INPLACE
untuk tabel yang menyertakan kolom temporal (DATE
,DATETIME
atauTIMESTAMP
) dan belum dibangun kembali menggunakanALTER TABLE ... ALGORITHM=COPY
. Dalam hal ini, suatuALTER TABLE ... ALGORITHM=INPLACE
operasi mengembalikan kesalahan.ADD PRIMARY KEY
klausa dalamCOPY mode
diam-diam mengkonversiNULL
ke nilai default untuk tipe data itu (0 untuk INT, string kosong untuk varchar), sedangkanIN_PLACE
tidak melakukan itu.Alasan lain untuk memilih
COPY
:Meskipun manual MySQL tidak berbicara tentang skenario aktual, Anda dapat membayangkan beberapa. Misalnya pengembang bergantung pada tabel yang dikunci selama
ALTER INDEX
operasi sehingga tabel hanya-baca atau sepenuhnya terkunci dan ada proses yang membaca tabel statis selama indeks dibangun kembali.sumber
ALGORITHM=INPLACE
dengan "ini DDL Online dan tidak akan mengunci basis data", padahal sebenarnya, mereka benar-benar ingin menggunakannyaLOCK=NONE
.@Stoleg mungkin punya jawaban terbaik, tapi ini satu lagi. Ini dugaan terpelajar yang ditinggalkan pengembang
=COPY
sebagai pintu keluar jika ada bug serius di dalamnya=INLINE
. Ini akan memungkinkan pengguna terus menggunakanALTER
bahkan jika fitur baru rusak.Saya telah melihat hal-hal seperti ini (pada flag
sql_mode
,,my.cnf
setting, dll) selama bertahun-tahun. Maksud dari rilis baru ini jelas untuk menghadirkan fitur baru yang lebih baik.Bendera optimisasi termasuk dalam kategori ini, tetapi bahkan ada lebih banyak alasan untuk bertahan pada tindakan sebelumnya - Pengoptimal akan selalu "melakukan kesalahan" kadang-kadang; ada terlalu banyak kemungkinan.
sumber
Dalam versi MySQL yang mendukung enkripsi tablespace InnoDB, ketika Anda mengubah tabel untuk menambahkan enkripsi, perubahan dilakukan menggunakan algoritma salin karena kebutuhan.
sumber