PolarDB-X mendukung Global Secondary Index (GSI). Gunakan INDEX hint untuk mengarahkan kueri ke GSI tertentu alih-alih membiarkan pengoptimal memilihnya secara otomatis.
Batasan
INDEX hint hanya didukung dalam pernyataan SELECT.
Sintaksis
PolarDB-X menyediakan dua sintaksis INDEX hint:
FORCE INDEX
Sintaksis FORCE INDEX mengikuti standar MySQL FORCE INDEX. Tuliskan secara inline dalam klausa FROM:
tbl_name [[AS] alias] FORCE INDEX({index_name})Jika indeks yang ditentukan bukan GSI, PolarDB-X meneruskan hint tersebut ke mesin penyimpanan MySQL.
INDEX() dalam hint TDDL
Hint INDEX() adalah hint kustom PolarDB-X yang ditulis dalam format komentar /*+TDDL: ... */. Hint ini mengidentifikasi GSI target dengan menggabungkan nama tabel (atau alias) dan nama indeks:
/*+TDDL:
INDEX({table_name | table_alias}, {index_name})
*/Hint tidak berpengaruh dalam kasus-kasus berikut:
Nama atau alias tabel yang ditentukan tidak ada.
Indeks yang ditentukan bukan GSI dari tabel tersebut.
Catatan penggunaan
Opsi -c saat menggunakan client command line MySQL
Saat menulis hint TDDL dalam format /*+TDDL:hint_command*/, client command line MySQL secara default menghapus hint bergaya komentar sebelum mengirim pernyataan ke server. Untuk mencegah hal ini, gunakan opsi -c saat menjalankan client:
mysql -h <host> -P <port> -u <user> -p -cTanpa -c, hint akan dihapus dan tidak berlaku. Untuk detail selengkapnya, lihat mysql Client Options di situs dokumentasi MySQL.
Format/!+TDDL:hint_command*/merupakan alternatif yang tidak dianggap sebagai komentar oleh client MySQL dan tidak memerlukan opsi-c.
Contoh
Contoh berikut menggunakan tabel berikut, yang memiliki dua GSI: g_i_seller (dipartisi berdasarkan seller_id) dan g_i_buyer (GSI unik yang 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 dalam JOIN
Tentukan GSI g_i_seller dengan FORCE INDEX 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 INDEX() dengan alias tabel
Tentukan GSI g_i_buyer menggunakan alias tabel a:
/*+TDDL:index(a, g_i_buyer)*/ SELECT * FROM t_order a WHERE a.buyer_id = 123