Membuat dan mengelola indeks pada replika baca

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.

Langkah berikutnya