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.
| Sintaksis | Cara kerja | Kapan 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})
*/- 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;