Untuk memodifikasi tipe data kolom, MySQL menggunakan algoritma COPY yang membangun ulang seluruh tabel. Selama proses ini, tabel hanya dapat dibaca dan tidak mengizinkan operasi penulisan bersamaan. Algoritma ini juga lambat karena berjalan pada satu thread. Hal ini menjadi kendala bagi pengguna MySQL dengan dataset besar. Untuk mengatasi masalah ini, PolarDB for MySQL menyediakan fitur Modifikasi Kolom Seketika, yang memungkinkan modifikasi cepat tipe kolom tanpa bergantung pada ukuran tabel. Fitur ini hanya memodifikasi metadata tabel. Topik ini menjelaskan cara menggunakan fitur Modifikasi Kolom Seketika.
Prasyarat
Kluster Anda harus menjalankan PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.28 atau lebih baru. Periksa versi mesin database kluster sebelum melakukan operasi untuk memastikan bahwa versi memenuhi persyaratan.
Parameter
Parameter | Tingkat | Deskripsi |
| Global | Menentukan apakah fitur Modifikasi Kolom Seketika diaktifkan. Nilai valid:
|
| Global | Jumlah maksimum kali fitur Modifikasi Kolom Seketika dapat memodifikasi tipe kolom sebuah tabel. Rentang nilai: 1 hingga 64. Nilai default: 16. |
Fitur Modifikasi Kolom Seketika dari PolarDB for MySQL sedang dalam rilis canary. Untuk menggunakan fitur ini, kunjungi Quota Center, temukan kuota dengan ID
polarm_82_instant_modify_column, lalu klik Apply.
Batasan
Fitur Modifikasi Kolom Seketika hanya dapat digunakan untuk memodifikasi panjang tipe kolom tertentu. Properti kolom lainnya tidak dapat dimodifikasi.
Tipe bilangan bulat: Fitur ini hanya mendukung penambahan panjang kolom antara tipe
TINYINT,SMALLINT,MEDIUMINT,INT, danBIGINT.Contoh: Anda dapat mengubah kolom dari tipe
INTmenjadiBIGINT, tetapi tidak dariBIGINTkeINT.Tipe string:
Anda dapat mengubah kolom string dari tipe
VARCHAR(N)menjadiVARCHAR(N+M), di mana N dan M adalah bilangan bulat positif lebih besar dari 0.Contoh: Anda dapat mengubah kolom string dari tipe
VARCHAR(50)menjadiVARCHAR(300), tetapi tidak dariVARCHAR(300)keVARCHAR(50).Anda dapat mengubah kolom string dari tipe
CHAR(N)menjadiCHAR(N+M), di mana N dan M adalah bilangan bulat positif lebih besar dari 0.Contoh: Anda dapat mengubah kolom string dari tipe
CHAR(30)menjadiCHAR(50), tetapi tidak dariCHAR(50)keCHAR(30).
Fitur ini hanya mendukung tabel dengan format baris
COMPACTatauDYNAMIC.Kolom tempat indeks dibuat tidak dapat dimodifikasi menggunakan fitur ini.
Fitur Instant Modify Column tidak mendukung tabel terpartisi. Lihat tabel terpartisi.
Kolom tabel dengan indeks teks penuh atau indeks spasial tidak dapat dimodifikasi menggunakan fitur ini.
Operasi Modifikasi Kolom Seketika tidak dapat disertakan dalam pernyataan SQL yang sama dengan operasi DDL lainnya.
Sebelum menjalankan operasi DDL, gunakan fitur EXPLAIN DDL untuk memeriksa apakah operasi mendukung algoritma INSTANT.
Penggunaan
Tentukan algoritma INSTANT untuk memaksa penggunaan fitur Modifikasi Kolom Seketika (direkomendasikan)
CREATE TABLE t(a int);SHOW CREATE TABLE t;
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8-- Tentukan penggunaan algoritma INSTANT untuk memodifikasi tipe kolom dengan cepat.
ALTER TABLE t modify COLUMN a bigint DEFAULT NULL,algorithm=INSTANT;Jika kolom tidak dapat ditambahkan menggunakan fitur Modifikasi Kolom Seketika, pesan kesalahan berikut akan dikembalikan: ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY/INPLACE. Dalam hal ini, pastikan parameter loose_innodb_polar_instant_modify_column_enable disetel ke ON dan verifikasi apakah operasi tersebut dibatasi. Informasi lebih lanjut tentang batasan fitur ini dapat ditemukan di bagian "Batasan".
Jangan tentukan algoritma atau tentukan algoritma default untuk PolarDB for MySQL memilih metode eksekusi optimal
Jika Anda tidak menentukan algoritma, atau Anda menentukan algoritma default, sistem akan memilih algoritma optimal berdasarkan prioritas algoritma .
ALTER TABLE test.test_table MODIFY COLUMN test_column bigint, ALGORITHM=DEFAULT;
ALTER TABLE test.test_table MODIFY COLUMN test_column bigint;PolarDB for MySQL mengevaluasi dan memilih algoritma DDL berdasarkan urutan preferensi berikut:
Algoritma INSTANT: Hanya memodifikasi metadata dalam kamus data tanpa memengaruhi data aktual dalam tabel. Operasi DDL dapat diselesaikan dalam hitungan detik, terlepas dari ukuran tabel.
Algoritma INPLACE: Memungkinkan akses baca dan tulis bersamaan selama operasi DDL untuk meminimalkan gangguan terhadap operasi bisnis. DDL paralel dapat digunakan untuk mempercepat operasi.
Algoritma COPY: Membangun ulang seluruh tabel. Selama proses ini, tabel hanya dapat dibaca dan tidak mengizinkan akses tulis, yang sangat memengaruhi operasi bisnis.
Lihat informasi tentang kolom yang dimodifikasi menggunakan fitur Modifikasi Kolom Seketika
Tabel INNODB_INSTANT_COLUMNS dalam database INFORMATION_SCHEMA mencatat semua kolom yang telah dimodifikasi menggunakan fitur Modifikasi Kolom Seketika dalam kluster saat ini. Hanya kolom yang dimodifikasi menggunakan fitur ini yang termasuk dalam tabel ini. Skema tabel INNODB_INSTANT_COLUMNS:
SHOW CREATE TABLE INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS;
***************************[ 1. row ]***************************
Table | INNODB_INSTANT_COLUMNS
Create Table | CREATE TEMPORARY TABLE `INNODB_INSTANT_COLUMNS` (
`TABLE_ID` bigint(21) unsigned NOT NULL DEFAULT '0',
`TABLE_NAME` varchar(193) NOT NULL DEFAULT '',
`SCHEMA_NAME` varchar(193) NOT NULL DEFAULT '',
`COLUMN_NAME` varchar(193) NOT NULL DEFAULT '',
`MTYPE` int(11) NOT NULL DEFAULT '0',
`PRTYPE` int(11) NOT NULL DEFAULT '0',
`LEN` int(11) NOT NULL DEFAULT '0',
`HAS_DEFAULT` int(1) NOT NULL DEFAULT '0',
`DEFAULT_VALUE` mediumblob,
`CURRENT_VERSION` int(11) NOT NULL DEFAULT '0',
`OLD_VERSION_INFO` blob
) ENGINE=InnoDB DEFAULT CHARSET=utf8Tabel berikut menjelaskan bidang yang dikembalikan dari pernyataan sebelumnya.
Nama kolom | Deskripsi |
TABLE_ID | ID tabel. |
TABLE_NAME | Nama tabel. |
SCHEMA_NAME | Nama skema. |
COLUMN_NAME | Nama kolom. |
MTYPE | Tipe kolom. |
PRTYPE | Tipe kolom presisi atau atribut. |
LEN | Panjang kolom. |
HAS_DEFAULT | Apakah kolom memiliki nilai default. |
DEFAULT_VALUE | Nilai default kolom. |
CURRENT_VERSION | Informasi versi kolom. |
OLD_VERSION_INFO | Informasi tipe historis kolom. |
Tabel INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS melacak kolom yang dimodifikasi menggunakan fitur Modifikasi Kolom Seketika. Anda dapat menanyakan tabel dengan menjalankan pernyataan berikut:
SELECT * FROM INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS;Jika Anda melakukan operasi DDL yang memerlukan pembangunan ulang tabel, seperti operasi DROP COLUMN pada kolom yang sebelumnya dimodifikasi menggunakan fitur Modifikasi Kolom Seketika, sistem akan menghapus informasi kolom terkait dari tabel INNODB_INSTANT_COLUMNS.