AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 338963
Accepted
DSZ
DSZ
Asked: 2024-04-24 22:36:11 +0800 CST2024-04-24 22:36:11 +0800 CST 2024-04-24 22:36:11 +0800 CST

Como evito que gravações grandes em tabelas interrompam o banco de dados?

  • 772

Eu tenho um servidor MySQL Percona 8, rodando via Docker, atuando como armazenamento de dados de apoio para um serviço muito utilizado. A cada hora, será executado um script que lê um valor de uma coluna virtual de aproximadamente 1,7 milhão de linhas (estimativa de tamanho da tabela de 2,3 GiB) e insere esse valor específico e os dados-chave associados em outra tabela da qual o sistema, de outra forma, apenas lê. A coluna virtual é uma pesquisa JSON json_extract(jsonData, '$.root.interestingValue')e possui o GENERATEDsinalizador. A ideia por trás disso é colocar menos pressão sobre a tabela que é considerada ativa e atualizada regularmente, quando os usuários estão interessados ​​apenas em alguns valores específicos e não é necessário recuperar o valor mais recente absoluto.

A consulta é a seguinte (com tabelas/colunas renomeadas)

CREATE TEMPORARY TABLE t1_cache_temp
SELECT
  t2.id as uid,
  t3.displayText as dt,
  t2.virtualColumn as interestingValue
FROM liveTable t2
JOIN otherLiveTable t3 on t2.id = t3.id;

TRUNCATE TABLE t1_cache;

INSERT INTO t1_cache
SELECT uid, dt, interestingValue FROM t1_cache_temp;

DROP TEMPORARY TABLE t1_cache_temp;

O tempo total gasto por este script é de 47 segundos.

Embora a leitura da tabela InnoDB e a gravação na tabela temporária sejam adequadas, a gravação na outra tabela InnoDB faz com que todas as outras operações no banco de dados sejam interrompidas após os primeiros segundos. Eu reduzi a INSERT INTO t1_cache...instrução executando cada instrução individualmente.

Também tentei escrever em tabelas novas e completamente não utilizadas (também usando InnoDB), o que dá o mesmo resultado. No momento da realização do último teste, apenas 2% do Máximo de Conexões permitidas estão em uso. Além disso, apenas 48% do buffer pool do InnoDB estava em uso.

Se eu mudar a mesa para MyISAM, tudo funciona normalmente, sem interrupções ou travamentos. Além disso, se eu remover a tabela temporária, o mesmo problema ocorrerá, independentemente do mecanismo InnoDB ou MyISAM.

Embora usar MyISAM seja provavelmente a melhor opção, o que poderia estar causando isso? Há algo que eu possa fazer sobre isso no nível da configuração?

mysql
  • 2 2 respostas
  • 47 Views

2 respostas

  • Voted
  1. Best Answer
    Bill Karwin
    2024-04-25T23:29:51+08:002024-04-25T23:29:51+08:00

    Você disse que suas gravações são de 2,3 GiB, mas o tamanho do redo log do InnoDB é de 48 MiB. Estimo que uma dessas gravações preencheria o redo log mais de 49 vezes.

    O redo log do InnoDB tem um tamanho fixo. As gravações não acrescentam nem aumentam, elas envolvem e sobrescrevem o arquivo de log. Cada vez que faz isso, o InnoDB deve pausar o SQL e liberar as páginas sujas do buffer pool para o disco até que uma boa parte do redo log não seja necessária. Este não será necessariamente o redo log completo , pode ser apenas o suficiente para o MySQL pensar que pode permitir mais gravações. Portanto, uma gravação de 2,3 GiB pode resultar em centenas de pontos de verificação.

    Recomendo a leitura desta postagem do blog para obter uma boa explicação de como o tamanho do arquivo de log afeta a taxa de transferência: https://www.percona.com/blog/what-is-a-big-innodb_log_file_size/

    O tamanho padrão do redo log do InnoDB é 48 MiB. Isto é suficiente apenas para um aplicativo com tráfego de gravação muito baixo. Por exemplo, um blog WordPress, que é em grande parte somente leitura e quando ocorrem gravações, elas são pequenas.

    Se houver espaço de armazenamento suficiente, eu aumentaria o redo log para 4GiB se você quiser permitir uma taxa de transferência mais fácil de gravações ocasionais de 2,3GiB.

    É uma vantagem dimensionar o arquivo de log com uma margem confortável, porque um ponto de verificação é acionado quando o log está 3/4 cheio. Consulte https://www.percona.com/blog/2011/04/04/innodb-flushing-theory-and-solutions/ para obter detalhes sobre isso.


    PS Eu não uso MyISAM se puder evitá-lo. Veja minha resposta aqui por um motivo: https://stackoverflow.com/questions/20148/myisam-versus-innodb/17706717#17706717

    • 1
  2. Rick James
    2024-04-29T09:04:44+08:002024-04-29T09:04:44+08:00

    Esse script está fazendo o dobro do trabalho necessário. Mudar para

    CREATE  TABLE t1_cache_temp   -- not TEMPORARY
    SELECT
      t2.id as uid,
      t3.displayText as dt,
      t2.virtualColumn as interestingValue
    FROM liveTable t2
    JOIN otherLiveTable t3 on t2.id = t3.id;
    
    RENAME TABLE t1_cache TO t1_old,
                 t1_cache_temp TO t1_cache,
    DROP TABLE t1_old;
    
    • 0

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve