All Products
Search
Document Center

PolarDB:Petunjuk Indeks

Last Updated:Mar 29, 2026

PolarDB-X 1.0 mendukung Global Secondary Index (GSI). Gunakan INDEX HINT untuk memaksa kueri SELECT membaca dari GSI tertentu, alih-alih membiarkan pengoptimal memilihnya.

Batasan

  • INDEX HINT hanya berlaku untuk pernyataan SELECT.

  • Instans ApsaraDB RDS for MySQL harus menjalankan MySQL 5.7 atau versi yang lebih baru.

  • Instans PolarDB-X 1.0 harus menjalankan versi 5.4.1 atau versi yang lebih baru.

Sintaksis

PolarDB-X 1.0 mendukung dua sintaksis INDEX HINT.

SintaksisCara kerjaKapan digunakan
FORCE INDEX(index_name)Identik dengan MySQL FORCE INDEX. Jika indeks yang disebutkan bukan GSI, petunjuk tersebut diteruskan ke instans ApsaraDB RDS for MySQL.Saat Anda menginginkan sintaksis inline yang kompatibel dengan MySQL.
/*+TDDL: INDEX(table, index)*/Petunjuk TDDL yang menargetkan GSI berdasarkan nama tabel (atau alias) dan nama indeks dalam blok kueri saat ini.Saat Anda perlu menargetkan GSI secara eksplisit dengan sintaksis petunjuk TDDL.

FORCE INDEX

tbl_name [[AS] alias] FORCE INDEX({index_name})

INDEX (petunjuk TDDL)

/*+TDDL:
    INDEX({table_name | table_alias}, {index_name})
*/
Catatan Petunjuk INDEX TDDL tidak berpengaruh dalam kasus-kasus berikut:
  • Kueri tidak mereferensikan nama tabel atau alias yang ditentukan.
  • GSI yang ditentukan bukan milik tabel yang ditentukan.

Catatan penggunaan

PolarDB-X 1.0 mendukung dua format komentar:

  • /*+TDDL:hint_command*/

  • /*!+TDDL:hint_command*/

Saat menggunakan client command line MySQL dengan format /*+TDDL:hint_command*/, tambahkan flag -c pada perintah login. Tanpa -c, client akan menghapus komentar MySQL dari pernyataan SQL sebelum mengirimkannya ke server, sehingga petunjuk tersebut diabaikan tanpa pemberitahuan.

Untuk detail selengkapnya, lihat opsi client MySQL.

Contoh

Contoh-contoh berikut menggunakan tabel berikut, yang memiliki dua GSI: g_i_seller (dipartisi berdasarkan seller_id) dan g_i_buyer (dipartisi berdasarkan buyer_id).

CREATE TABLE t_order (
  `id`             bigint(11)  NOT NULL AUTO_INCREMENT,
  `order_id`       varchar(20) DEFAULT NULL,
  `buyer_id`       varchar(20) DEFAULT NULL,
  `seller_id`      varchar(20) DEFAULT NULL,
  `order_snapshot` longtext    DEFAULT NULL,
  `order_detail`   longtext    DEFAULT NULL,
  PRIMARY KEY (`id`),
  GLOBAL INDEX `g_i_seller` (`seller_id`)
    dbpartition by hash(`seller_id`),
  UNIQUE GLOBAL INDEX `g_i_buyer` (`buyer_id`)
    COVERING (`seller_id`, `order_snapshot`)
    dbpartition by hash(`buyer_id`)
    tbpartition by hash(`buyer_id`) tbpartitions 3
) ENGINE=InnoDB DEFAULT CHARSET=utf8
  dbpartition by hash(`order_id`);

Gunakan FORCE INDEX untuk menargetkan g_i_seller

Targetkan GSI g_i_seller dalam klausa FROM:

SELECT a.*, b.order_id
FROM t_seller a
  JOIN t_order b FORCE INDEX(g_i_seller) ON a.seller_id = b.seller_id
WHERE a.seller_nick = "abc";

Gunakan petunjuk TDDL untuk menargetkan g_i_buyer

Targetkan GSI g_i_buyer dengan menggabungkan alias tabel a dan nama indeks:

/*+TDDL:index(a, g_i_buyer)*/ SELECT * FROM t_order a WHERE a.buyer_id = 123;