Hypergraph Optimizer: o novo otimizador de JOINs do MySQL

Como o Hypergraph Optimizer do MySQL modela consultas com múltiplas junções como um grafo para encontrar planos melhores, como ativá-lo com optimizer_switch e por que EXPLAIN FORMAT=TRADITIONAL não funciona com ele.

Para decidir em que ordem executar os JOINs de uma consulta, o otimizador clássico do MySQL usa uma busca gulosa: ele monta o plano tabela por tabela, sempre escolhendo a próxima que parece mais barata naquele momento, sem reconsiderar a decisão depois. Isso funciona bem para consultas simples, mas em JOINs com muitas tabelas, subconsultas e condições de OUTER JOIN misturadas, essa abordagem pode deixar passar planos melhores. O Hypergraph Optimizer é um otimizador de junções alternativo, reescrito do zero, que representa a consulta como um grafo onde tabelas são nós e condições de junção são arestas — daí o nome — permitindo explorar uma gama muito maior de ordens de junção possíveis antes de escolher a mais barata.

Por que um otimizador novo

O otimizador de junções atual do MySQL existe, em sua essência, desde as primeiras versões do produto. Ele foi estendido ao longo dos anos para lidar com casos como subconsultas correlacionadas e junções externas, mas cada extensão virou mais uma regra especial encaixada em uma arquitetura que não foi pensada para isso. O Hypergraph Optimizer ataca o problema de outro jeito: qualquer combinação de tabelas, junções internas ou externas, e subconsultas é modelada uniformemente como um hipergrafo, e o otimizador busca nesse grafo o plano de menor custo sem as limitações estruturais do antigo algoritmo guloso.

Ativando para uma consulta

O Hypergraph Optimizer é controlado pela flag hypergraph_optimizer da variável optimizer_switch, e vem desligado por padrão. A forma mais segura de experimentá-lo é ativá-lo apenas para uma consulta específica, com um hint SET_VAR, o que facilita comparar o plano antigo com o novo lado a lado:

SELECT /*+ SET_VAR(optimizer_switch = 'hypergraph_optimizer=on') */
    p.id, c.nome, i.produto
FROM pedidos p
JOIN clientes c ON c.id = p.cliente_id
JOIN itens_pedido i ON i.pedido_id = p.id
WHERE c.cidade = 'São Paulo'
  AND p.status = 'pendente';

Para ativar durante toda a sessão, em vez de repetir o hint em cada consulta:

SET SESSION optimizer_switch = 'hypergraph_optimizer=on';

E para voltar ao otimizador clássico:

SET SESSION optimizer_switch = 'hypergraph_optimizer=off';

Lendo o plano com EXPLAIN FORMAT=TREE

O Hypergraph Optimizer representa planos internamente de um jeito diferente do otimizador clássico, e por isso não é compatível com o formato tabular tradicional do EXPLAIN. Pedir FORMAT=TRADITIONAL com o hypergraph ativo retorna um erro:

SET SESSION optimizer_switch = 'hypergraph_optimizer=on';

EXPLAIN FORMAT=TRADITIONAL
SELECT * FROM pedidos WHERE cliente_id = 42;
ERROR 3999 (HY000): The hypergraph optimizer does not yet support
'EXPLAIN with TRADITIONAL format'.

O formato suportado é o TREE, o mesmo usado por EXPLAIN ANALYZE:

EXPLAIN FORMAT=TREE
SELECT p.id, c.nome
FROM pedidos p
JOIN clientes c ON c.id = p.cliente_id
WHERE p.status = 'pendente';
-> Nested loop inner join  (cost=118.40 rows=45)
    -> Filter: (p.status = 'pendente')  (cost=58.20 rows=45)
        -> Table scan on p  (cost=58.20 rows=900)
    -> Single-row index lookup on c using PRIMARY (id=p.cliente_id)
        (cost=0.25 rows=1)

Comparar essa árvore com a gerada pelo otimizador clássico, para a mesma consulta, é a forma mais direta de ver se o hypergraph escolheu uma ordem de junção diferente — e, com EXPLAIN ANALYZE FORMAT=TREE, também comparar os tempos reais de execução de cada plano.

Limitações atuais

O Hypergraph Optimizer ainda está em desenvolvimento ativo e não é um substituto completo do otimizador clássico:

Quando vale testar

Compatibilidade

A flag hypergraph_optimizer existe desde o MySQL 8.0.31 (outubro de 2022), inicialmente como recurso interno sem suporte oficial para uso em produção. A partir do MySQL 9.7 (2025), o Hypergraph Optimizer passou a estar disponível também na Community Edition, documentado oficialmente, mas ainda desligado por padrão e classificado como um recurso em evolução — vale testá-lo em um ambiente controlado antes de habilitá-lo de forma permanente. Builds que não incluem o recurso simplesmente ignoram ou rejeitam a tentativa de ativá-lo.

documentação oficial

Conclusão

O Hypergraph Optimizer não é só uma otimização incremental: é uma reescrita da forma como o MySQL decide a ordem dos JOINs, pensada para escalar melhor em consultas complexas que o algoritmo guloso clássico tem dificuldade em planejar bem. Ainda não é o padrão nem cobre todos os casos, mas já vale a pena ativá-lo em uma consulta pontual com o hint SET_VAR para comparar o plano gerado com o do otimizador atual.

Tecnologia:
mysql

Deixe seu Comentário!

Dúvida, sugestão ou só um "valeu!" — tudo é bem-vindo por aqui.

Comentário
Nome
Email
lock Seu e-mail não será publicado.