Todos os produtos
Search
Central de documentação

PolarDB:INDEX HINT

Última atualização: Jun 28, 2026

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