Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Atualizar usando `database/sql` em Go é lento


(Falando do ponto de vista do MySQL...)

Algumas "Regras Práticas":
  • Único INSERT :10ms
  • 100 ou mais linhas inseridas por um único INSERT :10 vezes mais rápido por linha.
  • BEGIN; INSERT...; INSERT...; ... COMMIT; :também 10x.
  • O acima assume HDD; O SSD pode ser 10 vezes mais rápido.
  • Se várias conexões estiverem fazendo inserções, elas podem poder correr em paralelo. 10 threads podem fazer 5 vezes o trabalho no mesmo tempo decorrido. (Claro, isso pode adicionar complexidade indesejada ao aplicativo.)

Figuras semelhantes para UPDATE , embora não seja fácil fazer atualizações diferentes em linhas diferentes com uma única consulta.

Seu teste mostra 8,5 ms por linha UPDATEd ao fazer uma linha de cada vez. Em lote com BEGIN...COMMIT provavelmente levará cerca de 85ms para todas as 100 linhas, mesmo no HDD.

Alguns aplicativos se prestam a lotes; alguns não. Se você quiser falar sobre como melhorar o desempenho do MySQL, precisamos entrar nos detalhes de sua aplicação.

Os contadores "Curtir" e "Visualizar" podem precisam ser movidos para uma tabela 'paralela', pois tendem a ser atualizados um de cada vez, com alguma interferência em outras atividades. Eles também tendem a permitir automaticamente multi-threading, portanto, muito menos de 850ms por 100. Em atividades muito altas (mais de, digamos, 1K visualizações por segundo), esses contadores podem ser agrupados artificialmente por meio de código de aplicativo extra.

Reescreva seu benchmark para refletir a atividade que acontecerá no aplicativo real. (Estou supondo que as atualizações acontecerão em paralelo, não em série. E eles serão espalhados aleatoriamente ao longo do tempo.)

Outra coisa... Se cada "contagem de visualizações" chega a um servidor web, então existe também conectar e desconectar; daí o decorrido tempo é provável que seja superior a 8,5 ms. Mas "decorrido" não é a questão crítica; o verdadeiro problema é "quantas atualizações podem ser realizadas por segundo".)

E outra coisa... Se você testar 'paralelo', não acerte a mesma linha em cada requisição. Isso provavelmente será muito mais lento do que se você atingir linhas diferentes. (Acertar uma linha aleatória seria melhor. Ter um viés em qual linha acertar seria ainda mais realista.)