O DDL paralelo acelera a criação de índices em tabelas grandes ao distribuir o trabalho entre várias threads, em vez de usar apenas uma. Quando há recursos de hardware disponíveis, esse recurso reduz o tempo de execução de DDL e diminui a janela em que operações subsequentes de Data Manipulation Language (DML) ficam bloqueadas.
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster PolarDB for MySQL que atenda aos requisitos de versão abaixo
A criação de índice secundário exige uma das seguintes versões de cluster:
PolarDB for MySQL 8.0.2, versão de revisão 8.0.2.1.7 ou posterior
PolarDB for MySQL 8.0.1, versão de revisão 8.0.1.1.10 ou posterior
PolarDB for MySQL 5.7, versão de revisão 5.7.1.0.7 ou posterior
A criação de índice de chave primária exige uma das seguintes versões de cluster:
PolarDB for MySQL 8.0.2, versão de revisão 8.0.2.2.9 ou posterior
PolarDB for MySQL 8.0.1, versão de revisão 8.0.1.1.31 ou posterior
Para verificar a versão do seu cluster, consulte Query the version number.
Limitações
O DDL paralelo permite criar índices de chave primária e índices secundários. Não há suporte para:
Índices de texto completo
Índices espaciais
Índices secundários em colunas virtuais
Impacto nos recursos
O DDL paralelo aumenta o uso de threads, elevando o consumo de CPU, memória e I/O. Definir uma contagem alta de threads paralelas faz com que a operação utilize mais memória. Se a instância ficar sem memória, poderá ocorrer um erro de out-of-memory (OOM), afetando a estabilidade do cluster. Execute o DDL paralelo fora dos horários de pico ou quando o cluster tiver recursos de hardware suficientes para evitar impactos nas operações SQL simultâneas.
Ative o DDL paralelo
Defina a contagem de threads para criação de índice secundário
O parâmetro innodb_polar_parallel_ddl_threads controla quantas threads são executadas em paralelo para cada operação DDL.
Parâmetro | Nível | Descrição |
| Sessão | Número de threads paralelas por operação DDL. Intervalo: 1–16. Padrão: 1 (thread única). Defina qualquer valor diferente de 1 para ativar o DDL paralelo na criação de índices secundários. Nota Quando definido como 1, o sistema ainda usa duas threads paralelas internamente. |
Exemplo:
-- Use 8 parallel threads for the current session
SET innodb_polar_parallel_ddl_threads = 8;
-- Create a secondary index using the configured thread count
ALTER TABLE t0 ADD INDEX idx_b (b);
Ative a criação paralela de índice de chave primária
O DDL paralelo para índices de chave primária requer ativação de teste adicional.
Para usar este recurso, acesse o Quota Center. Localize a cota com o Quota ID igual a polardb_mysql_pddl_for_pk e clique em Apply na coluna Actions para solicitar o teste.
|
Parâmetro |
Nível |
Descrição |
|
|
Global |
Controla se o DDL paralelo é permitido para a criação de índices de chave primária. Valores válidos: |
Otimizar a fase de ordenação
Caso o paralelismo padrão de threads não atenda aos seus requisitos de desempenho, ative a ordenação por amostra para otimizar ainda mais a fase de ordenação.
|
Parâmetro |
Nível |
Descrição |
|
|
Sessão |
Ativa a otimização de ordenação por amostra durante a criação de índices. Valores válidos: |
Exemplo:
SET innodb_polar_parallel_ddl_threads = 8;
SET innodb_polar_use_sample_sort = ON;
ALTER TABLE t0 ADD INDEX idx_b (b);
Otimizar a fase de carregamento
Para acelerar ainda mais a construção da árvore de índices, ative o carregamento em massa paralelo.
|
Parâmetro |
Nível |
Descrição |
|
|
Sessão |
Ativa a otimização de carregamento em massa paralelo para a criação da árvore de índices. Valores válidos: |
Exemplo — todas as três otimizações ativadas:
SET innodb_polar_parallel_ddl_threads = 8;
SET innodb_polar_use_sample_sort = ON;
SET innodb_polar_use_parallel_bulk_load = ON;
ALTER TABLE t0 ADD INDEX idx_b (b);
Teste de desempenho
Ambiente de teste
Cluster: PolarDB for MySQL 8.0 Standard Edition, 16 núcleos, 128 GB de memória
Armazenamento: 50 TB
Tabela de teste
CREATE TABLE t0(
a INT PRIMARY KEY,
b INT) ENGINE=InnoDB;
Os dados de teste foram gerados pelo seguinte procedimento:
DELIMITER //
CREATE PROCEDURE populate_t0()
BEGIN
DECLARE i int DEFAULT 1;
WHILE (i <= $table_size) DO
INSERT INTO t0 VALUES (i, 1000000 * RAND());
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
CALL populate_t0();
Substitua $table_size pelo número de linhas, como 1000000. O teste utiliza tabelas com 1.000.000, 10.000.000, 100.000.000 e 1.000.000.000 de linhas, além de uma tabela de 1 TB gerada com Sysbench. Para obter detalhes sobre a configuração do Sysbench, consulte Test tools.
Método de teste
Cada teste mede o tempo necessário para criar um índice secundário na coluna b (tipo INT) em tabelas de tamanho crescente, com innodb_polar_parallel_ddl_threads definido como 1, 2, 4, 8, 16 e 32.
Resultados do teste
Os gráficos abaixo mostram a taxa de aceleração em relação ao DDL de thread única (contagem de threads = 1) sob três combinações de parâmetros.
Apenas paralelismo de threads (innodb_polar_parallel_ddl_threads):

Paralelismo de threads + ordenação por amostra (innodb_polar_parallel_ddl_threads + innodb_polar_use_sample_sort):

Todos os três parâmetros (innodb_polar_parallel_ddl_threads + innodb_polar_use_sample_sort + innodb_polar_use_parallel_bulk_load):

Fale conosco
Se você tiver dúvidas sobre operações DDL, Contact us.
Recursos relacionados
Em caso de dúvidas sobre operações DDL, contact technical support.