Pergunta

Tínhamos um aplicativo em execução usando o MySQL. Descobrimos que o MySQL não era adequado para o nosso aplicativo depois que descobrimos que ele não suportava parte da capacidade GIS que o PostGIS possui (Nota: o MySQL suporta apenas a pesquisa de GIS retângulo no mínimo limitado).

Então, mudamos nosso banco de dados para PostgreSQL. Em seguida, descobrimos que o PostgreSQL 8.2 em execução no Windows é muito mais lento em comparação com o MySQL 5.1. Por mais lento, quero dizer com aproximadamente 4-5 vezes mais lento.

Por que é isso? Existe algo na configuração que precisamos mudar?

Encontrei alguns comentários de outros sites, como isto:

ATUALIZAR: Descobrimos que a causa da lentidão se deve à bolha que estamos inserindo no banco de dados. Precisamos ser capazes de inserir o BLOB a uma taxa sustentada de 10-15 Mb/s. Estamos usando o LO_READ e LO_WRITE da LIBPQ para cada blob, estamos inserindo/lendo. Essa é a melhor maneira? Alguém já usou o PGSQL para inserir uma grande quantidade a uma taxa alta antes?

EDIT: Ouvi dizer que o PGSQL recentemente foi portado para o Windows. Poderia ser uma das razões?

Foi útil?

Solução

Há casos em que o PostGresql no Windows paga uma sobrecarga adicional em comparação com outras soluções, devido a trocas feitas quando o portamos.

Por exemplo, o PostgreSQL usa um processo por conexão, o MySQL usa um thread. No UNIX, isso geralmente não é uma diferença de desempenho perceptível, mas no Windows a criação de novos processos é muito caro (devido à falta da chamada do sistema Fork ()). Por esse motivo, o uso de conexões persistentes ou um pool de conexão é Muito de Mais importante no Windows ao usar o PostGresql.

Outra edição que eu vi é que o início do PostgreSQL no Windows, por padrão, garantirá que as gravações estejam passando pelo cache de gravação - mesmo que seja apoiado pela bateria. Afaik, o MySQL não faz isso e afetará bastante o desempenho da gravação. Agora, isso é realmente necessário se você tiver um hardware não seguro, como uma unidade barata. Mas se você tiver um cache de gravação com suporte de bateria, deseja alterar isso para o FSYNC regular. As versões modernas do PostgreSQL (certamente 8.3) padrão open_datasync, o que deve remover essa diferença.

Você também menciona nada sobre como ajustou a configuração do banco de dados. Por padrão, o arquivo de configuração enviado com PostgreSQL é muito conservador. Se você não mudou nada lá, definitivamente precisa dar uma olhada. Há alguns conselhos de ajuste disponíveis no PostgreSQL Wiki.

Para fornecer mais detalhes, você precisará fornecer muito mais detalhes sobre exatamente o que é lento e como você ajustou seu banco de dados. Eu sugeriria um email para a lista de mala direta PGSQL-General.

Outras dicas

Embora a porta do Windows do PostgreSQL seja relativamente recente, meu entendimento é que ela executa e as outras versões. Mas é definitivamente um porto; Quase todos os desenvolvedores trabalham principalmente ou exclusivamente no Unix/Linux/BSD.

Você realmente não deveria estar executando 8.2 no Windows. Na minha opinião, 8.3 foi o primeiro lançamento do Windows que estava realmente pronto para produção; 8.4 ainda está melhor. 8.2 está desatualizado de qualquer maneira, e você colherá vários benefícios se conseguir atualizar.

Outra coisa a considerar é sintonizar. O PostgreSQL requer mais ajuste do que o MySQL para obter o melhor desempenho. Você pode querer considerar postar em um dos Listas de correspondência Para obter ajuda com mais do que ajustes básicos.

O PostgreSQL já é mais lento que o MySQL até um determinado ponto (é realmente mais rápido quando você tem um banco de dados ridiculamente grande). Apenas para sua informação, isso não está causando seu problema, mas lembre -se disso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top