Tendo índices apropriados em suas tabelas MySQL, você pode melhorar muito o desempenho das consultas SELECT. Mas, você sabia que adicionar índices às suas tabelas por si só é uma operação cara e pode levar muito tempo para ser concluída, dependendo do tamanho de suas tabelas? Durante esse período, você provavelmente também experimentará um desempenho degradado das consultas, pois os recursos do sistema também estarão ocupados no trabalho de criação de índice. Nesta postagem do blog, discutimos uma abordagem para otimizar o processo de criação de índice MySQL de forma que sua carga de trabalho regular não seja afetada.
Criação de índice móvel do MySQL
Chamamos essa abordagem de "Criação de índice contínuo". Se você tiver um conjunto de réplicas mestre-escravo do MySQL, poderá criar o índice um nó por vez de maneira contínua. Você deve criar o índice apenas nos nós escravos para que o desempenho do mestre não seja afetado. Quando a criação do índice é concluída nos escravos, rebaixamos o mestre atual e promovemos um dos escravos que está atualizado como o novo mestre. Neste momento, a construção do índice continua no nó mestre original (que agora é um escravo). Haverá uma curta duração (dezenas de segundos) durante a qual você perderá a conectividade com seu banco de dados devido ao failover, mas isso pode ser superado com novas tentativas no nível do aplicativo.
Benefícios de desempenho da criação de índice contínuo
Fizemos um pequeno experimento para entender os benefícios de desempenho da criação de índice contínuo.
O teste utilizou um conjunto de dados MySQL criado usando Sysbench que tinha 3 tabelas com 50 milhões de linhas cada. Geramos carga no MySQL master com 30 clientes executando uma carga de trabalho balanceada (50% de leituras e 50% de gravações) por 10 minutos e, ao mesmo tempo, construímos um índice secundário simples em uma das tabelas em dois cenários:
- Criando o índice diretamente no mestre
- Criando o índice no escravo
Configuração do banco de testes do MySQL
Tipo de instância MySQL | Instância EC2 m4.large com 8 GB de RAM |
---|---|
Tipo de implantação | Conjunto mestre-escravo de 2 nós com replicação semisíncrona |
Versão do MySQL | 5.7.25 |
Resultados de desempenho
Cenário | Taxa de transferência da carga de trabalho (consultas por segundo) | 95º percentil de latência |
---|---|---|
Criação de índice no mestre | 453,63 | 670 ms |
Criação de índice contínuo | 790,03 | 390 ms |
Resumo
Ao executar a criação do índice diretamente no MySQL master, pudemos experimentar apenas 60% da taxa de transferência obtida ao executar a criação do índice no MySQL slave por meio de uma operação contínua. A latência do percentil 95 das consultas também foi 1,8 vezes maior quando a criação do índice ocorreu no servidor mestre.
Prática recomendada para criar índices em suas tabelas #MySQLClick To Tweet
Automatizando a criação do Rolling Index
ScaleGrid automatiza a Criação de Rolling Index para sua implantação do MySQL com uma interface de usuário simples para iniciá-la.
Na interface do usuário acima, você pode selecionar o nome do banco de dados e da tabela e 'Adicionar índice' como a operação Alter Table. Em seguida, especifique um nome de coluna e um nome de índice, e um comando de alteração de tabela será gerado e exibido para você. Depois de clicar em Criar, a criação do índice acontecerá um nó por vez de forma contínua.
Além disso, ScaleGrid também suporta outras operações simples Alter Table, como adicionar uma nova coluna à sua tabela de forma contínua. Fique atento ao meu post de acompanhamento no blog com mais detalhes!