O DDL read-ahead acelera operações DDL em tabelas grandes ao pré-carregar páginas de dados antes que a varredura de criação de índice as alcance, o que reduz o tempo de espera de I/O durante a operação.
Ao executar uma instrução ALTER TABLE em uma tabela grande, o InnoDB lê cada página de dados sequencialmente para recriar índices ou reestruturar linhas. O DDL read-ahead antecipa o carregamento dessas páginas para garantir sua disponibilidade imediata quando necessárias.
Pré-requisitos
Antes de começar, verifique se seu cluster PolarDB atende a um dos seguintes requisitos de versão:
PolarDB for MySQL 8.0, versão de revisão 8.0.1.1.28 ou posterior
PolarDB for MySQL 5.7, versão de revisão 5.7.1.0.22 ou posterior
PolarDB for MySQL 5.6, versão de revisão 5.6.1.0.34 ou posterior
Para verificar a versão de revisão do seu cluster, consulte Consultar a versão do mecanismo.
Impacto no I/O e agendamento
O DDL read-ahead dedica threads adicionais ao pré-carregamento de páginas, aumentando o consumo de I/O enquanto a operação DDL estiver em andamento. Essa carga extra pode afetar cargas de trabalho SQL concorrentes. Execute o DDL read-ahead fora dos horários de pico para minimizar o impacto no tráfego de produção.
Parâmetros
Use os dois parâmetros globais a seguir para ativar o DDL read-ahead e ajustar seu volume de pré-carregamento.
loose_innodb_polar_ddl_build_index_readahead
|
Parâmetro |
Nível |
Padrão |
Valores válidos |
Descrição |
|
|
Global |
OFF |
ON, OFF |
Ativa ou desativa o DDL read-ahead. |
loose_innodb_polar_ddl_build_index_readahead_page_num
|
Parâmetro |
Nível |
Padrão |
Valores válidos |
Descrição |
|
|
Global |
64 |
32–256 |
Número de páginas a pré-carregar por solicitação de read-ahead. Cada página tem 16 KB. Valores maiores pré-carregam mais dados por solicitação, beneficiando varreduras sequenciais grandes, mas consomem mais largura de banda de I/O. |
Comece com o padrão de 64 páginas (1 MB por pré-carregamento). Aumente até 256 páginas (4 MB por pré-carregamento) para tabelas muito grandes, nas quais a varredura DDL seja o principal consumidor de I/O e o cluster disponha de capacidade ociosa de I/O.
Teste de desempenho
O benchmark a seguir compara o tempo de execução de DDL com e sem o read-ahead ativado.
Ambiente de teste
PolarDB for MySQL 8.0, 8 núcleos de CPU, 32 GB de memória
Capacidade de armazenamento: 50 TB
Schema
CREATE TABLE `table_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`seller_id` bigint(20) DEFAULT NULL,
`seller_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`gmt_create` varchar(30) DEFAULT NULL,
`update_time` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
Dados de teste
Insira 100.000.000 de linhas usando o seguinte stored procedure:
delimiter ||
CREATE PROCEDURE populate_0(IN NUM INT)
BEGIN
DECLARE sid INT;
DECLARE suffix_name INT;
DECLARE i INT;
SET sid=1000;
SET suffix_name=10;
SET i=1;
START TRANSACTION;
WHILE i <= NUM
DO
INSERT INTO table_1(seller_id,seller_name,gmt_create,update_time) VALUES(sid,CONCAT('sellername',suffix_name),NOW(),NOW());
SET suffix_name=suffix_name+1;
SET sid=sid+1;
SET i=i+1;
END WHILE;
COMMIT;
END ||
delimiter ;
CALL populate_0(100000000);
Reinicie os processos do PolarDB antes de executar cada teste para limpar o cache do buffer pool. Isso garante que os resultados reflitam o desempenho de I/O de disco, e não dados em cache.
Resultados
Todos os testes usam loose_innodb_polar_ddl_build_index_readahead_page_num=256 quando o read-ahead está ativado.
ALTER TABLE table_1 ADD INDEX name_index (seller_name):
|
DDL read-ahead |
Tempo (segundos) |
|
Desativado |
485 |
|
Ativado |
412 |
ALTER TABLE table_1 ADD COLUMN c1 varchar(100) after id:
|
DDL read-ahead |
Tempo (segundos) |
|
Desativado |
264 |
|
Ativado |
159 |
Fale conosco
Se tiver dúvidas sobre operações DDL, entre em contato com o suporte técnico.
Próximos passos
Entre em contato conosco se tiver dúvidas sobre operações DDL no PolarDB.