O registro prejudica o desempenho do MySQL - mas, por quê?

9

Estou bastante surpreso por não conseguir ver uma resposta para isso em nenhum lugar do site, nem na documentação do MySQL (a seção 5.2 parece ter um registro bem coberto!)

Se eu habilitar binlogs, vejo um pequeno impacto no desempenho (subjetivamente), o que é esperado com um pouco de IO extra - mas quando eu habilito um log geral de consultas, vejo um enorme impacto no desempenho (o dobro do tempo para executar consultas, ou pior), muito além do que vejo nos binlogs. É claro que agora estou registrando todos os SELECT e UPDATE / INSERT, mas outros daemons registram todos os pedidos (Apache, Exim) sem interromper.

Estou vendo os efeitos de estar perto de um "ponto de inflexão" do desempenho quando se trata de E / S ou há algo fundamentalmente difícil em registrar consultas que faz com que isso aconteça? Eu adoraria poder registrar todas as consultas para facilitar o desenvolvimento, mas não posso justificar o tipo de hardware que parece ser necessário para obter desempenho novamente com o logon geral de consultas.

Obviamente, faço logon consultas lentas e há melhorias insignificantes no uso geral se eu desabilitar isso.

(Tudo isso está no Ubuntu 10.04 LTS, MySQLd 5.1.49, mas a pesquisa sugere que este é um problema bastante universal)

James Green
fonte

Respostas:

9

Os logs de consulta geral são muito mais IO que os logs binários. Além do fato de a maioria dos servidores SQL serem de 90% a 10% de gravações, os logs binários são armazenados em formato binário, em vez de texto sem formatação que utiliza menos espaço em disco. (Quanto menos espaço? Não tenho certeza. Desculpe.)

Há dois aspectos pelos quais o Apache e o Exim podem registrar todas as solicitações sem impacto significativo no desempenho. A primeira é que eles registram o fato de uma solicitação ter ocorrido, mas o que eles colocam no log geralmente é significativamente menor que a solicitação real. Uma solicitação HTTP geralmente é duas vezes maior que a linha que entra no log e até mesmo um email curto em texto sem formatação é 10 ou 20 vezes maior que a linha de log que o acompanha. Um email com um anexo de 10 MB ainda terá apenas algumas linhas escritas no log.

A segunda parte disso é que, em um aplicativo Web normal, geralmente existem dezenas de consultas SQL associadas a uma única página HTTP. Os e-mails tendem a chegar em números ainda menores que os pedidos de HTTP. Seu servidor MySQL provavelmente está tentando registrar muito mais do que o Apache ou o Exim.

Veja o tamanho (descompactado) dos seus logs binários e gerais do MySQL e seus logs do Apache e Exim no final do dia. Aposto que você acha que o log geral do MySQL é o maior por um fator de pelo menos 5.

Ladadadada
fonte
1
Alguns pontos positivos - em particular, sim, um único GET para o nosso aplicativo pode causar centenas de SELECTs, pois, embora tentemos fazer o máximo possível em uma única consulta, às vezes trocamos o desempenho / limpeza disso por estrutura mais elegante, código mais legível e um banco de dados mais limpo. (À parte, tudo começou, na verdade, falando sobre o conteúdo de log de POSTs e a URL de GETs, pois vemos os parâmetros que o CGI.pm vê em um caso e não no outro, e daí em log / desempenho em geral). De qualquer forma, já faz algumas horas, então, resposta aceita. Obrigado!
James Green
4

Para adicionar à resposta fornecida , você também verá um desempenho atingido se estiver acessando o mesmo dispositivo em que seus repositórios de dados MySQL residem - se for o mesmo disco, você estará lendo e gravando em vários locais o tempo todo, diminuindo a velocidade de todo o processo.

Isso é verdade mesmo que seja uma partição diferente no mesmo disco físico.

Se o registro estiver indo para um dispositivo diferente, isso deverá aliviar alguns dos problemas de desempenho.

Warren
fonte
1
Não é relevante para a minha situação - é uma VM hospedada e os bancos de dados estão em um volume lógico separado para / var, fornecido por sua vez a partir da mesma matriz de armazenamento. Suponho que, em teoria, eles poderiam estar nos mesmos eixos, mas seria uma coincidência infernal :-) Dito isso, +1 à parte, porque isso seria absolutamente relevante para alguém com, por exemplo, uma configuração padrão do Debian / Ubuntu (DBs em / var / mysql, efetua login em / var / log)!
James Green
@jimbo - graças para os adereços mesmo se não é directamente aplicável à sua situação particular :)
Warren