Halaman ini menjelaskan cara menambahkan dan menghapus indeks pada replika baca Cloud SQL. Meskipun replika biasanya bersifat hanya baca, terkadang Anda perlu membuat indeks sekunder pada tabel untuk tujuan pelaporan. Cloud SQL menawarkan serangkaian prosedur tersimpan untuk mengelola indeks ini.
Terminologi
- Indeks berkluster. Indeks utama pada tabel MySQL yang secara fisik mengurutkan baris pada disk. Ketika Anda menentukan kunci utama pada tabel, MySQL akan menggunakannya sebagai indeks berkluster. Hanya boleh ada satu indeks berkluster pada tabel.
- Indeks sekunder. Indeks tambahan pada tabel MySQL yang mengoptimalkan performa kueri.
Prosedur tersimpan untuk indeks
Cloud SQL menyertakan dua prosedur tersimpan dalam skema mysql
yang dapat Anda
gunakan untuk menambahkan dan menghapus indeks sekunder pada replika baca MySQL. Perlu diingat bahwa
meskipun dapat berjalan pada instance sumber utama, prosedur-prosedur ini dirancang
untuk replika baca.
- mysql.addSecondaryIdxOnReplica
- Menambahkan indeks sekunder pada database. Prosedur tersimpan ini adalah sebuah
wrapper untuk
pernyataan DDL
BUAT INDEX.
Parameter:
idxType
- Jenis indeks yang akan dibuat. Misalnya, gunakan UNIQUE untuk membuat indeks unik.idxName
- Nama indeks.tableName
- Nama tabel dalam format schema.name.idxDefinition
- Definisi indeks. Jangan sertakan tanda kurung bagian luar.idxOption
- Semua opsi tambahan yang akan digunakan pada pembuatan indeks. Misalnya, di MySQL 8.0, sebuah opsi dapat menggunakan INVISIBLE untuk indeks tak terlihat.
Sintaks:
mysql.addSecondaryIdxOnReplica(idxType, idxName, tableName, idxDefinition, idxOption)
- mysql.dropSecondaryIdxOnReplica
- Menghapus indeks sekunder pada database. Prosedur tersimpan ini adalah sebuah
wrapper untuk
pernyataan DDL
HAPUS INDEX.
Parameter:
idxName
- Nama indeks.tableName
- Nama tabel dalam format schema.name.idxOption
- Semua opsi tambahan yang akan digunakan saat menghapus indeks. Misalnya, opsi algoritma seperti INPLACE.
Sintaks:
mysql.dropSecondaryIdxOnReplica(idxName, tableName, idxOption)
Untuk parameter idxType
dan idxOption
, merujuklah pada dokumentasi untuk
mengetahui versi utama MySQL yang berjalan di instance Cloud SQL.
Contoh
Penggunaan yang Benar
Berikut adalah beberapa contoh pemanggilan prosedur. Misalkan kita memiliki tabel dengan definisi berikut.
CREATE TABLE sampletest.t1(
id int(10) unsigned NOT NULL AUTO_INCREMENT,
first_name varchar(64) NOT NULL,
last_name varchar(64) NOT NULL,
license_id int NOT NULL,
PRIMARY KEY (id),
KEY idx_fname (first_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Jika ingin membuat indeks reguler bernama t1_fname_lname
pada
kolom first_name
dan last_name
, Anda harus menjalankan hal-hal berikut:
call mysql.addSecondaryIdxOnReplica('', 't1_fname_lname', 'sampletest.t1', 'first_name, last_name', '')
Jika Anda juga ingin membuat indeks unik bernama t1_license_id
pada
kolom license_id
dengan komentar "id lisensi unik", Anda harus menjalankan perintah berikut:
call mysql.addSecondaryIdxOnReplica('unique', 't1_license_id', 'sampletest.t1', 'license_id', 'comment \"unique license id\"')
Jika Anda kemudian ingin menghapus indeks t1_fname_lname, Anda perlu menjalankan perintah berikut:
call mysql.dropSecondaryIdxOnReplica('t1_fname_lname', 'sampletest.t1', '')
Penggunaan yang Salah
Upaya berikut untuk membuat indeks di kolom first_name
dan last_name
gagal karena tanda kurung luar dalam parameter idxDefinition.
call mysql.addSecondaryIdxOnReplica('', 't1_extra_parenthesis', 'sampletest.t1', '(first_name, last_name)', '')
Anda hanya dapat menambahkan indeks pada tabel yang dibuat pelanggan. Upaya membuat indeks di kolom host tabel mysql.servers berikut akan gagal.
call mysql.addSecondaryIdxOnReplica('', 'idx_invalid', 'mysql.servers', 'host', '')
Anda hanya dapat menggunakan prosedur dropSecondaryIdxOnReplica
untuk menghapus indeks
yang pernah dibuat sebelumnya menggunakan prosedur addSecondaryIdxOnReplica
. Misalnya,
panggilan berikut untuk menghapus indeks idx_fname
yang sudah ada akan gagal.
call mysql.dropSecondaryIdxOnReplica('idx_fname', 'sampletest.t1', '')
Injeksi SQL dalam panggilan prosedur ini akan gagal. Misalnya, injeksi SQL berikut dengan urutan komentar akan gagal.
call mysql.addSecondaryIdxOnReplica(\"user 'a'@'%' --\", 'idx_fname', 'sampletest.t1', 'first_name', '')
Begitu pula dengan upaya injeksi SQL dengan pembatas akan gagal.
call mysql.addSecondaryIdxOnReplica('', 'idx_fname', 'sampletest.t1', 'first_name', ';flush status')
Pembuatan ulang replika baca
Terkadang, saat terjadi masalah, Cloud SQL akan membuat ulang replika baca dari sumber utama untuk memulihkan instance dengan cepat. Indeks yang dibuat pada replika baca sebelum dilakukannya operasi pembuatan ulang tidak akan disimpan. Pelanggan bertanggung jawab untuk membuat ulang indeks tersebut menggunakan prosedur yang disimpan pada replika baca.