6 pontos por GN⁺ 2024-04-10 | 1 comentários | Compartilhar no WhatsApp
  • Mecanismo de banco de dados compatível com MySQL, escrito em Go puro
  • Um mecanismo SQL independente da fonte de dados, que executa consultas sobre a fonte de dados fornecida usando a sintaxe e o protocolo do MySQL
  • Inclui uma implementação simples de banco de dados em memória, e também permite consultar a fonte de dados desejada ao implementar seu próprio backend

Compatibilidade

  • Exceto por algumas limitações específicas, o go-mysql-server pode ser usado como substituto do MySQL
  • Bibliotecas cliente, ferramentas, consultas, sintaxe SQL e funções SQL que funcionam no MySQL também devem funcionar no go-mysql-server
  • Se encontrar diferenças de funcionalidade, envie uma issue

Escopo do projeto

  • Servidor e mecanismo SQL para consultar fontes de dados
  • Implementação de backend de banco de dados em memória adequada para uso em testes
  • Interfaces que podem ser usadas para implementar novos backends para consultar suas próprias fontes de dados
  • Considerando alguns cuidados e usando uma implementação completa de banco de dados, ele pode substituir um banco de dados MySQL

Principais casos de uso do go-mysql-server:

  1. Substituir o MySQL em ambientes de teste em Go usando a implementação de banco de dados memory integrada
  2. Permitir acesso por consultas SQL a qualquer fonte de dados ao implementar algumas interfaces

Uso do servidor de teste em memória

  • O servidor de teste em memória pode substituir um servidor MySQL real nos testes
  • É possível iniciar o servidor usando o código de exemplo fornecido
  • Quando o servidor estiver em execução, é possível conectar-se com um cliente MySQL, um conector MySQL para Go ou o shell mysql

Limitações da implementação de banco de dados em memória

  • A implementação de banco de dados em memória incluída foi feita para uso em testes
  • Limitações conhecidas:
    • Não é thread-safe. Para evitar problemas de concorrência, as instruções DDL e DML devem ser restritas a uma única goroutine
    • Não oferece suporte a transações. Instruções como START TRANSACTION, ROLLBACK e COMMIT não funcionam
    • Implementação de índice ineficiente. Buscas por índice e joins executam varredura completa da tabela nas tabelas internas

Implementação de backend personalizado

  • É possível criar um backend que consulta sua própria fonte de dados implementando algumas interfaces
  • Para instruções detalhadas, consulte o guia de backend

Projetos movidos por go-mysql-server

  • dolt
  • gitbase (descontinuado)
  • Se você estiver construindo um backend de banco de dados com go-mysql-server, avise

Licença

  • Apache License 2.0

Opinião do GN⁺

  • O go-mysql-server parece ser um mecanismo de banco de dados compatível com MySQL, leve e escrito em Go, útil para substituir o MySQL em ambientes de teste ou para consultar fontes de dados próprias via SQL
  • Como seu objetivo é a compatibilidade com MySQL, espera-se que possa ser adotado em aplicações já baseadas em MySQL sem grandes modificações
  • No entanto, ainda é um projeto experimental e, especialmente no caso da implementação em memória, seu uso se limita a testes; por isso, em produção, parece exigir cuidado em termos de desempenho e estabilidade
  • Para desenvolvedores de backend, pode ser atraente o fato de ser possível implementar diretamente as interfaces e conectar a fonte de dados desejada. Vale a pena consultar exemplos de projetos reais, como o Dolt
  • Bancos de dados compatíveis com MySQL semelhantes incluem TiDB e CockroachDB. Diferentemente deles, o go-mysql-server tem a vantagem de permitir implementar livremente o backend, mas, em contrapartida, isso também traz o custo adicional de desenvolver esse backend

1 comentários

 
GN⁺ 2024-04-10
Comentários no Hacker News
  • Como motor de consultas que roda o Dolt, o go-mysql-server é a parte mais importante
  • Escreveu a maior parte do código do Dolt, mas não é o autor original. A história de como o projeto começou é interessante
  • A ideia do Dolt é atraente, mas ele é diferente demais e sua camada de persistência é crítica demais, então falta maturidade para construir um negócio em cima dele. Mas seria ótimo se os bancos de dados principais adotassem isso
  • Se o suporte evoluir de MySQL para PostgreSQL e SQLite, seria possível ter suporte a múltiplos motores de banco de dados no WordPress e afins
  • Parece ser um proxy de wire protocol de MySQL para SQL. O banco proxied padrão é o Dolt, e imagina-se que tenha sido extraído dele
  • Go pode ser melhor, mas do ponto de vista de um desenvolvedor C#, implementar um banco de dados em uma linguagem com GC é preocupante. Seria preciso lutar contra o GC e escrever muito código de baixa alocação nada óbvio. Pode ser aceitável para equipes pequenas, mas será difícil contratar desenvolvedores com as habilidades certas
  • A compatibilidade e os recursos são muito limitados, então é difícil usá-lo em produção (sem suporte a transações, implementação de índices ineficiente etc.). Também fica a dúvida se há suporte a triggers, stored procedures e afins
  • Fica a curiosidade de quão difícil seria usá-lo como substituto in-memory do MySQL para testar projetos Rails. Como a camada de banco é importante, seria preciso cautela em produção, mas seria interessante se pudesse acelerar os testes
  • TiDB é um banco de dados distribuído compatível com MySQL, escrito em Go e Rust, e StarRocks é um banco de dados OLAP compatível com MySQL, escrito em Java e C++. Mas este projeto parece abordar outra perspectiva. Como a biblioteca MySQL do Vitess é difícil de usar, talvez isso possa ser usado para construir uma camada de abstração como uma ORM
  • Implementações assim são impressionantes de ver, mas fica a dúvida se haverá uso real para isso
  • Sugere-se seguir o SQL padrão em vez do MySQL