Os índices padrão em tabelas particionadas são locais e abrangem apenas os dados de uma única partição. Por isso, consultas sem filtro pela chave de partição exigem varredura em todas as partições, não retornam resultados ordenados globalmente e impõem que restrições de unicidade incluam todas as chaves de partição. Os índices secundários globais (GSIs) eliminam essas limitações ao abranger todas as partições, o que permite consultar qualquer coluna com eficiência e impor unicidade sem incluir as chaves de partição.
Para usar este recurso, acesse o Quota Center . Localize a cota pelo Quota ID polardb_mysql_gsi e clique em Apply na coluna Actions.
Limitações dos índices locais
Um índice local segue o mesmo particionamento da tabela. Cada partição do índice cobre apenas a partição correspondente da tabela; assim, os dados ficam ordenados dentro de cada partição, mas não entre elas. Essa característica gera três problemas quando as consultas não incluem a chave de partição:
Varredura completa de partições: O sistema verifica todas as partições, o que causa amplificação de leitura proporcional ao número de partições.
Ausência de ordem global garantida: Resultados de partições ordenadas individualmente não possuem ordenação global, o que pode exigir uma etapa adicional de classificação.
Restrição de índice único: Um índice único local deve incluir todas as chaves de partição para garantir unicidade entre partições.
O GSI não é particionado. Ele é construído com dados de todas as partições e possui ordenação global. Um índice globalmente único em um GSI dispensa a inclusão de todas as chaves de partição.
Quando usar um GSI
|
Cenário |
Tipo de índice recomendado |
Motivo |
|
Consultas frequentes com filtro por colunas fora da chave de partição |
GSI |
Evita varreduras completas nas partições |
|
Restrições de unicidade global em colunas fora da chave de partição |
GSI |
Índices únicos locais exigem todas as chaves de partição |
|
Arquivamento infrequente de partições (ex.: partições mensais retidas por anos) |
GSI |
Melhor desempenho de consulta e menor rotatividade de partições |
|
Consultas restritas principalmente a uma única partição |
Índice local |
Menor sobrecarga de escrita |
Versões suportadas
Este recurso requer um cluster PolarDB for MySQL versão 8.0.2, revisão 8.0.2.2.7 ou posterior. Para verificar a versão do seu cluster, consulte Consultar o número da versão.
Limitações
Os GSIs são suportados apenas em tabelas particionadas InnoDB. Não há suporte para tabelas com particionamento híbrido.
Um GSI não pode ser do tipo full-text ou espacial.
Não há suporte para GSIs em tabelas compactadas, temporárias ou criptografadas. Tabelas com formato de linha REDUNDANT ou COMPRESSED também não são suportadas.
Tabelas com GSIs não aceitam colunas geradas.
-
Operações DDL no nível de partição invalidam os GSIs existentes, exceto ao adicionar ou excluir partições RANGE ou LIST e ao truncar partições. Exclua e recrie todos os GSIs da tabela ou use a sintaxe
UPDATE GLOBAL INDEXpara recriá-los na mesma instrução.NotaA exclusão de partições RANGE ou LIST e o truncamento de partições sem invalidação dos GSIs constituem um recurso controlado. Solicite acesso antes de utilizá-lo. Para mais informações, consulte Melhorias do recurso.
Melhorias do recurso
Crie GSIs mais rapidamente com DDL paralelo.
Use adição instantânea de coluna em tabelas particionadas com GSIs.
Tabelas particionadas por RANGE ou LIST com GSIs aceitam bloqueios de metadados (MDLs) no nível de partição durante a adição de novas partições.
Converta uma tabela com GSIs para particionamento INTERVAL RANGE ou crie GSIs diretamente em tabelas particionadas por INTERVAL RANGE.
Ao executar operações DDL no nível de partição em tabelas com GSIs, utilize a sintaxe
UPDATE GLOBAL INDEXpara recriar os GSIs na mesma instrução.-
Exclua partições RANGE ou LIST, ou trunque partições de qualquer tipo, sem invalidar os GSIs existentes. Trata-se de um recurso controlado. Para ativá-lo, acesse o Quota Center e pesquise pelo Quota ID
polardb_mysql_gsi_drop_partitionoupolardb_mysql_gsi_truncate_part. Na coluna Actions, clique em Apply para ativar o recurso.NotaEste recurso é suportado apenas no PolarDB for MySQL 8.0.2, revisão 8.0.2.2.31 ou posterior.
-
Dados obsoletos podem permanecer no GSI se você excluir ou truncar partições em uma tabela com GSIs sem recriá-lo. Ative a limpeza assíncrona para que uma thread em segundo plano remova esses dados automaticamente. Trata-se de um recurso controlado. Para ativá-lo, acesse o Quota Center e pesquise pelo Quota ID
polardb_mysql_gsi_async_purge. Na coluna Actions, clique em Apply para ativar o recurso.NotaEste recurso é suportado apenas no PolarDB for MySQL 8.0.2, revisão 8.0.2.2.35 ou posterior.
Sintaxe
Adicione a palavra-chave GLOBAL ou LOCAL após o nome do índice durante a criação.
A omissão da palavra-chave resulta na criação de um índice local por padrão.
-- Create a global index
INDEX index_name(column) GLOBAL
-- Create a local index
INDEX index_name(column) LOCAL
Criar um GSI
Criar um GSI inline com a tabela
Adicione a palavra-chave GLOBAL ao definir o índice em CREATE TABLE:
CREATE TABLE t1(
a INT PRIMARY KEY,
b INT,
INDEX k1(b) GLOBAL
) PARTITION BY HASH(a) PARTITIONS 3;
Adicionar um GSI a uma tabela existente
Use ALTER TABLE para adicionar um índice global ou CREATE UNIQUE INDEX para adicionar um índice globalmente único:
-- Create the table
CREATE TABLE t1(
a INT PRIMARY KEY,
b INT
) PARTITION BY HASH(a) PARTITIONS 3;
-- Add a global index on column b
ALTER TABLE t1 ADD INDEX k1(b) GLOBAL;
-- Add a globally unique index on column b
CREATE UNIQUE INDEX k2 ON t1(b) GLOBAL;
Recriar um GSI durante DDL de partição
Use UPDATE GLOBAL INDEX para recriar os GSIs na mesma instrução da operação DDL no nível de partição. Isso evita que os GSIs fiquem em estado inválido.
O exemplo abaixo cria uma tabela particionada por RANGE com um GSI, exclui uma partição e recria o GSI em uma única instrução:
-- Step 1: Create a range-partitioned table with a global index
CREATE TABLE t1(
a INT PRIMARY KEY,
b INT,
INDEX k1(b) GLOBAL
) PARTITION BY RANGE (`a`)
(PARTITION p0 VALUES LESS THAN (5) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (10) ENGINE = InnoDB);
-- Step 2: Drop the p1 partition and rebuild the GSI
ALTER TABLE t1 DROP PARTITION p1 UPDATE GLOBAL INDEX;
Desempenho
Os GSIs superam os índices locais em consultas SELECT, UPDATE e DELETE sem filtro pela chave de partição. Essa vantagem aumenta conforme crescem o número de partições e o volume de dados.
Configuração do teste: Duas tabelas particionadas por HASH com 32 partições e 1.000.000 de linhas cada — uma com índice local e outra com GSI.
-- Table with local index
CREATE TABLE mytest1.big_table_1(
a INT PRIMARY KEY,
b INT,
c INT,
INDEX k1(b) LOCAL
) PARTITION BY HASH(a) PARTITIONS 32;
-- Table with GSI
CREATE TABLE mytest2.big_table_1(
a INT PRIMARY KEY,
b INT,
c INT,
INDEX k1(b) GLOBAL
) PARTITION BY HASH(a) PARTITIONS 32;
SELECT — tempo de execução; a condição da consulta não inclui a chave de partição:

UPDATE — tempo de execução; a condição da consulta não inclui a chave de partição:

DELETE — tempo de execução; a condição da consulta não inclui a chave de partição:

A vantagem de desempenho dos GSIs torna-se mais evidente à medida que aumentam o volume de dados e o número de partições.
Próximos passos
DDL paralelo — acelere a criação de GSIs em tabelas grandes
Adição instantânea de coluna — adicione colunas a tabelas particionadas com GSIs sem recriar toda a tabela
Tabelas particionadas por INTERVAL RANGE — gerenciamento automático de partições compatível com GSIs