ProxySQL Query Rewrite: Modificando query sem mudar aplicação

Todo DBA já passou pelo momento em que precisou alterar uma query (majoritariamente por performance) e recebeu do time de aplicação a informação de que não é possível alterá-la, seja por aplicação legada ou por aplicação de terceiros. Embora a melhor opção para essas alterações seja sempre fazer na fonte (aplicação), há momentos em que teremos de realizar a alteração ao nível de banco de dados/proxy.

Caso esteja utilizando o ProxySQL, essa problemática é facilmente concornada com o ProxySQL Query Rewrite. Neste blog, vou exemplificar como reescrever uma query com o ProxySQL.

O problema

Há momentos em que a aplicação pode escolher o index incorreto para uma execução mais performática, ou até mesmo utilizar um hint para um index específico. Em casos como esse, forçar um índice pode ser uma possível correção para a aplicação.

Cenário

Para os testes abaixo, favor considerar o uso do MySQL 8.4 e do ProxySQL 2.7.

Criando a tabela orders no nosso MySQL:

Carregando 200 mil linhas, valor de status aproximadamente 50/50:

A query de exemplo da aplicação — últimos pedidos ‘shipped’ de um cliente (42):

Plano ruim utilizando index idx_status

Para replicarmos o problema de escolha de index errado, vamos nesse caso utilizar o hint USE INDEX, para o index idx_status, o que nesse caso deverá escanear uma grande quantidade de linhas

Vale lembrar que o problema acima pode ocorrer devido a estatísticas incorretas; porém, há casos em que, mesmo com estatísticas corretas, o optimizer escolhe um índice menos performático.

Tempo de execução da query:

Melhorando a execução

É possível melhorar a execução da query acima forçando o uso do index idx_customer:

Solução com ProxySQL Query Rewrite

No ProxySQL existe a tabela mysql_query_rules. Essa tabela será utilizada para reescrever a query. Para isso, utilizaremos os campos match_pattern e replace_pattern, aplicados por meio de regex.

Criando a regra de rewrite

Nesse caso, alteraremos o comando USE INDEX (idx_status) para FORCE INDEX (idx_customer).

Criando a regra 3 que fará alteração:

  • rule_id 1: Sending to hostgroup 2
  • rule_id 2: Sending to hostgroup 1
  • rule_id 3: rewrite USE → FORCE

Campos importantes:

  • match_pattern — regex RE2 com (?s)^ para multiline;
  • replace_pattern — \1 reinjeta as colunas capturadas antes do FROM.
Validar que o rewrite ocorreu

Enviar a query via ProxySQL

Verificar hits no ProxySQL

Podemos ver que os hits da regra número 3 aumentam a cada vez que a executamos via ProxySQL.

Validando o Plano via MySQL Slow Query Log

Um ponto de atenção: regex pode ser perigoso; teste corretamente seu regex e verifique as queries que serão alteradas, para não alterar uma query incorreta.

Conclusão

Quando uma query lenta vem de uma aplicação que não pode ser alterada, reescrever o SQL no ProxySQL pode ser uma alternativa de workaround. O Query Rewrite troca pode incluir, remover ou alterar uma query via regex, sem tocar no código da aplicação. Podendo dar mais tempo para execução de uma melhor solução.

Referências
COMPARTILHE:
Picture of Roberto de Bem

Roberto de Bem

Roberto de Bem é Database Engineer na Percona e entusiasta de Open Source. Sempre que possível, contribuo com pull requests, principalmente para projetos e produtos da Percona. Formado em Sistemas de Informação, trabalha com bancos de dados desde 2017, com foco em MySQL. Oracle Certified Professional – MySQL 8.0. Oracle ACE Apprentice.
Picture of Roberto de Bem

Roberto de Bem

Roberto de Bem é Database Engineer na Percona e entusiasta de Open Source. Sempre que possível, contribuo com pull requests, principalmente para projetos e produtos da Percona. Formado em Sistemas de Informação, trabalha com bancos de dados desde 2017, com foco em MySQL. Oracle Certified Professional – MySQL 8.0. Oracle ACE Apprentice.

PARTICIPE

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

POSTADO POR
Picture of Roberto de Bem

Roberto de Bem

Roberto de Bem é Database Engineer na Percona e entusiasta de Open Source. Sempre que possível, contribuo com pull requests, principalmente para projetos e produtos da Percona. Formado em Sistemas de Informação, trabalha com bancos de dados desde 2017, com foco em MySQL. Oracle Certified Professional – MySQL 8.0. Oracle ACE Apprentice.
PARCEIROS