PostgreSQL ou MySQL: qual escolher

Para um projeto novo, PostgreSQL é a escolha mais segura: tem mais recursos de SQL, índices e tipos de dados. MySQL continua ótimo para apps simples e para stacks que já o usam.

Atualizado em 5 min de leitura

Objetivos de aprendizado

Depois de ler este artigo, você vai conseguir:

  • Entender as diferenças reais entre PostgreSQL e MySQL
  • Comparar SQL, JSON, índices e transações com exemplos
  • Escolher o banco certo para o seu tipo de projeto
Nesta página

PostgreSQL e MySQL são os dois bancos relacionais de código aberto mais usados. Os dois guardam dados em tabelas, falam SQL, suportam transações e rodam em qualquer servidor. Para a maior parte dos apps, qualquer um dos dois funciona.

A diferença aparece nos detalhes: tipos de dados, tipos de índice, comportamento de transações e a sintaxe de alguns comandos. Este guia compara o que muda na prática, com código, para você escolher com critério.

PostgreSQLDDL dentro da transaçãoBEGINALTER 1ALTER 2ROLLBACKtudo desfeitoMySQLBEGINALTER 1commit implícitoALTER 2Meio migradoALTER 1 já valeu
No PostgreSQL uma migração que falha volta inteira com ROLLBACK; no MySQL cada ALTER já faz commit e o que rodou fica.

O que cada um é?#

PostgreSQL é um banco objeto-relacional que prioriza aderência ao padrão SQL e extensibilidade. Cada versão maior recebe 5 anos de suporte. Veja o que é PostgreSQL para o básico.

MySQL é um banco relacional mantido pela Oracle, famoso pela simplicidade e pela presença em hospedagens e CMS como o WordPress. Seu motor padrão é o InnoDB, que oferece transações ACID, bloqueio por linha, chaves estrangeiras e MVCC. O MySQL tem dois trilhos de versão: o LTS, que só recebe correções, e o Innovation, que pode trazer mudanças de comportamento. Para produção estável, comece numa série LTS em suporte. Veja o que é MySQL.

Quais são as diferenças, lado a lado?#

Critério PostgreSQL MySQL (InnoDB)
Modelo Objeto-relacional, extensível Relacional
Concorrência MVCC: leitura não bloqueia escrita MVCC com bloqueio por linha
DDL em transação Sim, CREATE e ALTER podem ser revertidos Não, DDL faz commit implícito
Índice parcial Sim (CREATE INDEX ... WHERE) Não
Índice em expressão Sim Sim, por parte de chave funcional ou coluna gerada
JSON jsonb, indexável com GIN Tipo JSON, indexa-se um valor extraído
Upsert ON CONFLICT ... DO UPDATE ON DUPLICATE KEY UPDATE
Devolver linhas gravadas RETURNING Não tem
Extensões Muitas (como PostGIS) Plugins, menos extensível
Curva de aprendizado Um pouco maior Mais simples de começar

Como o upsert muda entre os dois?#

Inserir ou atualizar se já existir é uma tarefa comum, e a sintaxe é diferente. No PostgreSQL:

sql
INSERT INTO usuarios (id, nome)
VALUES (1, 'Ana')
ON CONFLICT (id) DO UPDATE SET nome = EXCLUDED.nome
RETURNING id, nome;

Nas versões atuais do MySQL, use um alias de linha (a função VALUES() está obsoleta):

sql
INSERT INTO usuarios (id, nome)
VALUES (1, 'Ana') AS novo
ON DUPLICATE KEY UPDATE nome = novo.nome;

O RETURNING do PostgreSQL devolve a linha gravada na mesma consulta. No MySQL, você faz um SELECT depois.

Como cada um trata transações e concorrência?#

Os dois seguem o modelo ACID e usam MVCC. No PostgreSQL, a documentação diz que leitura nunca bloqueia escrita e escrita nunca bloqueia leitura nas consultas comuns. Bloqueios explícitos, como SELECT ... FOR UPDATE, ainda esperam.

A diferença que mais surpreende está nas migrações. No PostgreSQL, você pode rodar ALTER TABLE dentro de uma transação e dar ROLLBACK se algo der errado. No MySQL, um ALTER TABLE encerra a transação ativa com commit implícito: se a migração falhar no meio, as etapas anteriores já valeram.

E JSON e índices avançados?#

Os dois guardam JSON. No PostgreSQL, o tipo jsonb pode ser indexado com GIN para buscar chaves e valores dentro do documento. No MySQL, uma coluna JSON não é indexada diretamente: você indexa um valor extraído, por coluna gerada ou por parte de chave funcional.

O índice parcial é outra vantagem do PostgreSQL. Ele cobre só as linhas que importam:

sql
CREATE INDEX pedidos_abertos ON pedidos (criado_em) WHERE pago IS NOT TRUE;

Menos linhas indexadas significa índice menor e escritas mais baratas. No MySQL, o índice sempre cobre todas as linhas da tabela.

Um deles é mais rápido?#

Benchmarks que coroam um vencedor universal raramente refletem a sua carga. Nos dois, os maiores ganhos vêm do mesmo lugar: um índice que combine com o seu WHERE e o seu ORDER BY, consultas que buscam só as colunas necessárias e um pool de conexões, para não abrir uma conexão por requisição. Rode EXPLAIN nas suas consultas mais lentas em cada motor antes de culpar o banco. Se um teste com os seus dados reais mostrar uma diferença clara, esse resultado vale mais que qualquer benchmark genérico.

Quando escolher PostgreSQL e quando escolher MySQL?#

Escolha PostgreSQL se você quer migrações seguras, JSON consultável, índices parciais, extensões (como geolocalização) ou consultas analíticas mais complexas. É um bom padrão para projetos novos e APIs.

Escolha MySQL se sua stack já o exige (WordPress, sistemas legados), se a equipe domina o MySQL ou se o app é um CRUD simples. Trocar de motor sem motivo custa mais que qualquer ganho teórico.

Em ambos os casos, o que mais pesa é o índice certo e a modelagem, não o motor. Se ainda estiver em dúvida entre tipos de banco, leia qual banco de dados escolher.

Como fazer isso na Square Cloud#

A Square Cloud oferece hospedagem de PostgreSQL e de MySQL a partir do plano Standard, sempre em versões recentes. Você cria o banco no painel, e ele é provisionado em segundos no mesmo datacenter das suas aplicações (cerca de 1 ms de latência média), com TLS obrigatório. O PostgreSQL é o nativo, sem extensões, então recursos como o PostGIS não estão disponíveis.

Você escolhe o motor, conecta a sua aplicação pela URL de conexão que o painel entrega e controla o resto. Os dois motores podem conviver no mesmo plano, cada um com no mínimo 1024 MB da RAM do plano. Você tira snapshots manuais quando quiser, e todo plano com bancos inclui também um snapshot automático diário. O Hobby não inclui hospedagem de banco.

Conheça a hospedagem de PostgreSQL e a hospedagem de MySQL.

Hospedagem de bancos

MongoDB, PostgreSQL, MySQL e Redis no mesmo datacenter do app

Saiba mais

Perguntas frequentes

PostgreSQL é melhor que MySQL?

Não existe vencedor universal. PostgreSQL oferece mais recursos de SQL e de indexação. MySQL é simples, muito difundido e atende bem a maioria dos apps CRUD. A escolha depende do que o projeto precisa.

Qual é mais rápido, PostgreSQL ou MySQL?

Depende da consulta, dos índices e da configuração. Em apps comuns a diferença raramente decide o projeto, porque um índice certo pesa mais que o motor. Meça com os seus dados antes de decidir.

Dá para migrar de MySQL para PostgreSQL depois?

Dá, mas exige trabalho: tipos, sintaxe de upsert, aspas de identificadores e comportamentos diferentes precisam ser revisados. Quanto mais cedo você escolher, mais barato fica.

MySQL e MariaDB são a mesma coisa?

Não. MariaDB nasceu como um fork do MySQL e hoje evolui separado, com diferenças de recursos. Os dois ainda se parecem bastante no dia a dia.

Próximo artigoMongoDB vs PostgreSQL: qual escolher?MongoDB vs PostgreSQL comparados: modelo de dados, joins, transações, JSON, índices e escala, e quando cada banco é a melhor escolha para o seu projeto.

Mais em Bancos de dados

Ver todos os 24 artigos