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
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.
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:
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):
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:
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
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.
Mais em Bancos de dados
Ver todos os 24 artigos- Quanto custa um banco de dados na nuvem?Um banco de dados na nuvem custa de zero a centenas de dólares por mês. Veja o que define o preço: instância, disco, tráfego, snapshots e como estimar o seu.
- Como hospedar um banco de dados (e conectar sua aplicação)Para hospedar um banco de dados, escolha o motor, crie a instância, guarde a string de conexão em variável de ambiente e teste a conexão. Veja o passo a passo.
- O que é Redis e para que serveRedis é um banco de dados em memória que guarda pares chave-valor e estruturas de dados. Veja como funciona, para que serve e quando não usar.
- Como fazer backup do banco de dados (MySQL, PostgreSQL, MongoDB)Faça backup de MySQL, PostgreSQL e MongoDB com mysqldump, pg_dump e mongodump, e restaure o dump. Veja os comandos, como verificar e os erros comuns.