O PolarDB-X oferece suporte a índices secundários globais (GSIs). Use hints de INDEX para direcionar uma consulta a um GSI específico em vez de permitir que o otimizador escolha automaticamente.
Limitações
Os hints de INDEX têm suporte apenas em instruções SELECT.
Sintaxe
O PolarDB-X oferece duas sintaxes para hints de INDEX:
FORCE INDEX
A sintaxe FORCE INDEX segue o padrão MySQL FORCE INDEX. Insira-a diretamente na cláusula FROM:
tbl_name [[AS] alias] FORCE INDEX({index_name})
Se o índice especificado não for um GSI, o PolarDB-X encaminhará o hint ao mecanismo de armazenamento MySQL.
INDEX() em um hint TDDL
O hint INDEX() é personalizado do PolarDB-X e usa o formato de comentário /*+TDDL: ... */. Ele identifica o GSI de destino ao combinar o nome da tabela (ou alias) com o nome do índice:
/*+TDDL:
INDEX({table_name | table_alias}, {index_name})
*/
Esse hint não surte efeito nos seguintes casos:
O nome da tabela ou alias especificado não existe.
O índice indicado não é um GSI dessa tabela.
Observações de uso
A opção -c no cliente de linha de comando MySQL
Ao escrever hints TDDL no formato /*+TDDL:hint_command*/, o cliente de linha de comando MySQL remove hints em estilo de comentário por padrão antes de enviar a instrução ao servidor. Para evitar isso, use a opção -c ao iniciar o cliente:
mysql -h <host> -P <port> -u <user> -p -c
Sem a opção -c, o hint é removido e não surte efeito. Para mais detalhes, consulte mysql Client Options na documentação do MySQL.
O formato/!+TDDL:hint_command*/é uma alternativa que o cliente MySQL não trata como comentário, dispensando o uso da opção-c.
Exemplos
Os exemplos abaixo usam a seguinte tabela, que tem dois GSIs: g_i_seller (particionado por seller_id) e g_i_buyer (um GSI único particionado por 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`);
Uso de FORCE INDEX em um JOIN
Especifique o GSI g_i_seller com FORCE INDEX na cláusula 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";
Uso de INDEX() com alias de tabela
Especifique o GSI g_i_buyer usando o alias de tabela a:
/*+TDDL:index(a, g_i_buyer)*/ SELECT * FROM t_order a WHERE a.buyer_id = 123