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 / server / Perguntas / 1164409
Accepted
squarefighter
squarefighter
Asked: 2024-08-28 02:57:09 +0800 CST2024-08-28 02:57:09 +0800 CST 2024-08-28 02:57:09 +0800 CST

Desempenho lento do banco de dados após restaurar o dump do mariadb 10.4.22 para 11.2.4, o comando ANALYZE TABLE não funciona

  • 772

Estou executando o Moodle em um dos meus dois servidores, ele tem o banco de dados do Moodle no MariaDB 10.4.22 e está em manutenção, então transferi o Moodle para o outro servidor que tem o MariaDB 11.2.4, no entanto, o segundo servidor está tendo problemas com o desempenho do banco de dados do Moodle. Encontrei um tópico nos fóruns do Moodle falando sobre problemas com o despejo do banco de dados do MariaDB 10.4.2 restaurado para uma versão posterior à 11. Lá está escrito que preciso executar ANALYZE TABLE no banco de dados para fazê-lo funcionar melhor:

https://moodle.org/mod/forum/discuss.php?d=446712

Eu tentei esse comando em cada tabela no BD, no entanto, não funcionou e o BD ainda está muito lento (principalmente mensagens), tentei restaurar o dump para o servidor antigo e funcionou normalmente, no entanto, o moodle não suporta mais o mariadb 10.4.2, então terei que atualizar, o que posso fazer? Existe outro comando que eu possa executar? Como posso solucionar o problema? (Não tenho muita experiência com solução de problemas, então se vocês quiserem alguma informação, é só dizer que eu vou fornecer porque não sei quais informações são necessárias para resolver esse problema)

aqui estão os resultados quando executo o mysqltuner no novo servidor (aquele com o mariadb 11.2.4), mas não parece ajudar muito.

mysqltuner1 mysqltuner2 mysqltuner3 mysqltuner4

EDIT: Recebi um retorno do meu slowlog

# Time: 240828 12:55:04
# User@Host: user[user] @ localhost []
# Thread_id: 318  Schema: my_db  QC_hit: No
# Query_time: 332.625304  Lock_time: 0.000335  Rows_sent: 32  Rows_examined: 111342578
# Rows_affected: 0  Bytes_sent: 0
use my_db;
SET timestamp=1724849704;
SELECT m.id as messageid, mc.id as id, mc.name as conversationname, mc.type as conversationtype, m.useridfrom,
                   m.smallmessage, m.fullmessage, m.fullmessageformat, m.fullmessagetrust, m.fullmessagehtml, m.timecreated,
                   mc.component, mc.itemtype, mc.itemid, mc.contextid, mca.action as ismuted
              FROM ehvp_message_conversations mc
        INNER JOIN ehvp_message_conversation_members mcm
                ON (mcm.conversationid = mc.id AND mcm.userid = '21')
        LEFT JOIN (
                      SELECT m.conversationid, MAX(m.id) AS messageid
                        FROM ehvp_messages m
                  INNER JOIN (
                                  SELECT m.conversationid, MAX(m.timecreated) as maxtime
                                    FROM ehvp_messages m
                              INNER JOIN ehvp_message_conversation_members mcm
                                      ON mcm.conversationid = m.conversationid
                               LEFT JOIN ehvp_message_user_actions mua
                                      ON (mua.messageid = m.id AND mua.userid = '21' AND mua.action = '2')
                                   WHERE mua.id is NULL
                                     AND mcm.userid = '21'
                                GROUP BY m.conversationid
                             ) maxmessage
                           ON maxmessage.maxtime = m.timecreated AND maxmessage.conversationid = m.conversationid
                     GROUP BY m.conversationid
                   ) lastmessage
                ON lastmessage.conversationid = mc.id
        LEFT JOIN ehvp_messages m
               ON m.id = lastmessage.messageid
        LEFT JOIN ehvp_message_conversation_actions mca
               ON (mca.conversationid = mc.id AND mca.userid = '21' AND mca.action = '1')
            WHERE mc.id IS NOT NULL
              AND mc.enabled = 1  AND (mc.type = '1' OR mc.type = '3')   AND mc.id <> '13'
          ORDER BY (CASE WHEN m.timecreated IS NULL THEN 0 ELSE 1 END) DESC, m.timecreated DESC, id DESC LIMIT 0, 51;

EDIT 2: Eu uso o comando EXPLAIN na consulta em ambos os servidores:

O servidor mariadb 11.2.4 (aquele que sofre com problemas de desempenho, o banco de dados é chamado my_db aqui):

+------+-----------------+------------+------------+----------------------------------------------------------------------------------+---------------------------------------------------+---------+--------------------------------------------+---------+----------------------------------------------+
| id   | select_type     | table      | type       | possible_keys                                                                    | key                                               | key_len | ref                                        | rows    | Extra                                        |
+------+-----------------+------------+------------+----------------------------------------------------------------------------------+---------------------------------------------------+---------+--------------------------------------------+---------+----------------------------------------------+
|    1 | PRIMARY         | mcm        | ref        | ehvp_messconvmemb_con_ix,ehvp_messconvmemb_use_ix                                | ehvp_messconvmemb_use_ix                          | 8       | const                                      | 4092    | Using where; Using temporary; Using filesort |
|    1 | PRIMARY         | mc         | eq_ref     | PRIMARY,ehvp_messconv_typ_ix                                                     | PRIMARY                                           | 8       | my_db.mcm.conversationid                   | 1       | Using where                                  |
|    1 | PRIMARY         | <derived2> | ref        | key0                                                                             | key0                                              | 9       | my_db.mcm.conversationid                   | 1       |                                              |
|    1 | PRIMARY         | m          | eq_ref     | PRIMARY                                                                          | PRIMARY                                           | 8       | lastmessage.messageid                      | 1       | Using where                                  |
|    1 | PRIMARY         | mca        | ref|filter | ehvp_messconvacti_use_ix,ehvp_messconvacti_con_ix                                | ehvp_messconvacti_con_ix|ehvp_messconvacti_use_ix | 8|8     | my_db.mcm.conversationid                   | 1 (11%) | Using where; Using rowid filter              |
|    2 | LATERAL DERIVED | m          | ref        | ehvp_mess_contim_ix,ehvp_mess_con_ix                                             | ehvp_mess_contim_ix                               | 8       | my_db.mcm.conversationid                   | 2       | Using where; Using index                     |
|    2 | LATERAL DERIVED | <derived3> | ref        | key0                                                                             | key0                                              | 17      | my_db.m.conversationid,my_db.m.timecreated | 1       |                                              |
|    3 | DERIVED         | m          | index      | ehvp_mess_contim_ix,ehvp_mess_con_ix                                             | ehvp_mess_contim_ix                               | 16      | NULL                                       | 9664    | Using index; Using temporary; Using filesort |
|    3 | DERIVED         | mua        | eq_ref     | ehvp_messuseracti_usemesac_uix,ehvp_messuseracti_use_ix,ehvp_messuseracti_mes_ix | ehvp_messuseracti_usemesac_uix                    | 24      | const,my_db.m.id,const                     | 1       | Using where; Using index; Not exists         |
|    3 | DERIVED         | mcm        | ref        | ehvp_messconvmemb_con_ix,ehvp_messconvmemb_use_ix                                | ehvp_messconvmemb_con_ix                          | 8       | my_db.m.conversationid                     | 1       | Using where                                  |
+------+-----------------+------------+------------+----------------------------------------------------------------------------------+---------------------------------------------------+---------+--------------------------------------------+---------+----------------------------------------------+

O servidor mariadb 10.4.2 (aquele sem problemas, o banco de dados é chamado moodle aqui):

+------+-----------------+------------+------------+----------------------------------------------------------------------------------+---------------------------------------------------+---------+----------------------------------------------+---------+----------------------------------------------+
| id   | select_type     | table      | type       | possible_keys                                                                    | key                                               | key_len | ref                                          | rows    | Extra                                        |
+------+-----------------+------------+------------+----------------------------------------------------------------------------------+---------------------------------------------------+---------+----------------------------------------------+---------+----------------------------------------------+
|    1 | PRIMARY         | mcm        | ref        | ehvp_messconvmemb_con_ix,ehvp_messconvmemb_use_ix                                | ehvp_messconvmemb_use_ix                          | 8       | const                                        | 2988    | Using where; Using temporary; Using filesort |
|    1 | PRIMARY         | mc         | eq_ref     | PRIMARY,ehvp_messconv_typ_ix                                                     | PRIMARY                                           | 8       | moodle.mcm.conversationid                    | 1       | Using where                                  |
|    1 | PRIMARY         | <derived2> | ref        | key0                                                                             | key0                                              | 9       | moodle.mcm.conversationid                    | 2       |                                              |
|    1 | PRIMARY         | m          | eq_ref     | PRIMARY                                                                          | PRIMARY                                           | 8       | lastmessage.messageid                        | 1       | Using where                                  |
|    1 | PRIMARY         | mca        | ref|filter | ehvp_messconvacti_use_ix,ehvp_messconvacti_con_ix                                | ehvp_messconvacti_con_ix|ehvp_messconvacti_use_ix | 8|8     | moodle.mcm.conversationid                    | 1 (11%) | Using where; Using rowid filter              |
|    2 | LATERAL DERIVED | m          | ref        | ehvp_mess_contim_ix,ehvp_mess_con_ix                                             | ehvp_mess_contim_ix                               | 8       | moodle.mcm.conversationid                    | 1       | Using index                                  |
|    2 | LATERAL DERIVED | <derived3> | ref        | key0                                                                             | key0                                              | 17      | moodle.m.conversationid,moodle.m.timecreated | 2       |                                              |
|    3 | DERIVED         | m          | index      | ehvp_mess_contim_ix,ehvp_mess_con_ix                                             | ehvp_mess_contim_ix                               | 16      | NULL                                         | 5005    | Using index; Using temporary; Using filesort |
|    3 | DERIVED         | mua        | ref        | ehvp_messuseracti_usemesac_uix,ehvp_messuseracti_use_ix,ehvp_messuseracti_mes_ix | ehvp_messuseracti_mes_ix                          | 8       | moodle.m.id                                  | 1       | Using where; Not exists                      |
|    3 | DERIVED         | mcm        | ref|filter | ehvp_messconvmemb_con_ix,ehvp_messconvmemb_use_ix                                | ehvp_messconvmemb_con_ix|ehvp_messconvmemb_use_ix | 8|8     | moodle.m.conversationid                      | 1 (3%)  | Using where; Using rowid filter              |
+------+-----------------+------------+------------+----------------------------------------------------------------------------------+---------------------------------------------------+---------+----------------------------------------------+---------+----------------------------------------------+

Parece que há pequenas diferenças entre os índices de ambos os servidores.

EDIT 3: Esses são os retornos do comando SHOW CREATE TABLE para as tabelas envolvidas na consulta do slowlog:

Crie tabelas para o servidor mariadb 11.2.4 (aquele com problemas de desempenho)

https://pastebin.com/LFTyXvcJ

Crie tabelas para o servidor mariadb 10.4.2 (aquele sem problemas)

https://pastebin.com/FSvj9fCV

mariadb
  • 2 2 respostas
  • 103 Views

2 respostas

  • Voted
  1. Rick James
    2024-08-28T07:47:47+08:002024-08-28T07:47:47+08:00

    "Analyze não funcionou" -- Você quer dizer que não ajudou no desempenho? Ou que travou de alguma forma? ( ANALYZE TABLEgeralmente é inútil para tabelas InnoDB.)

    "471 tabelas" para o Moodle?? Eu não esperaria mais do que uma dúzia -- 1 para os dados e algumas para logins.

    "[--] Up for: 13s (529 q [40.692 qps]" -- espere pelo menos uma hora. Muitas coisas precisam ser armazenadas em cache na RAM para que a velocidade melhore

    "[OK] Consultas lentas: 0% (0/529)" -- reduza long_query_timepara "1" e colete o slowlog.

    "[--] Memória física: 4,0 G" e "[OK] Buffer pool InnoDB / tamanho dos dados: 2,0 G / 1,2 G" -- Isso é perigosamente alto; há alguma troca? (Eu recomendo apenas 1 G em innodb_buffer_pool_sizeuma máquina com 4 GB de RAM.)

    Imagino que você não consiga modificar as consultas? A que você apresentou é bem complexa:

    • ORé difícil otimizar
    • ORDER BY expression LIMIT ...cheira a paginação que não pode ser tornada eficiente.
    • Talvez alguns índices compostos possam ser adicionados. Por favor, forneça `SHOW CREATE TABLE para as tabelas.
    • 0
  2. Best Answer
    squarefighter
    2024-08-29T03:53:56+08:002024-08-29T03:53:56+08:00

    Consegui fazer o servidor mariadb 11.2.4 rodar um pouco melhor limpando todas as tabelas, INDEX_STATISTICS, QUERY CACHE, TABLE_STATISTICS e RESETANDO QUERY CACHE no banco de dados, e então adicionando o cache de consulta ao arquivo my.cnf:

    tamanho_do_cache_de_consulta=64M

    ele ainda roda muito lento na primeira vez, mas depois carrega muito mais rápido, ainda estou tentando descobrir por que a consulta de mensagem ainda tem problemas, mas agora tem uma solução paliativa.

    Resolvi o problema!

    Acontece que o problema era um conflito de colunas nas tabelas de mensagens do Moodle. Em junho, trunquei a tabela ehvp_messages para limpar as mensagens no Moodle. Isso criou um conflito em outras tabelas que registram informações sobre essas mensagens porque começou a criar duplicatas nessas tabelas. Para resolver isso, simplesmente trunquei todas as tabelas de mensagens no Moodle. Executei esta consulta no seu banco de dados (isso excluirá todas as mensagens do seu Moodle):

     TRUNCATE TABLE ehvp_message;
     TRUNCATE TABLE ehvp_message_airnotifier_devices;
     TRUNCATE TABLE ehvp_message_contact_requests;
     TRUNCATE TABLE ehvp_message_contacts;
     TRUNCATE TABLE ehvp_message_conversation_actions;
     TRUNCATE TABLE ehvp_message_conversation_members;
     TRUNCATE TABLE ehvp_message_conversations;
     TRUNCATE TABLE ehvp_message_email_messages;
     TRUNCATE TABLE ehvp_message_popup;
     TRUNCATE TABLE ehvp_message_popup_notifications;
     TRUNCATE TABLE ehvp_message_processors;
     TRUNCATE TABLE ehvp_message_providers;
     TRUNCATE TABLE ehvp_message_read;
     TRUNCATE TABLE ehvp_message_user_actions;
     TRUNCATE TABLE ehvp_message_users_blocked;
     TRUNCATE TABLE ehvp_messageinbound_datakeys;
     TRUNCATE TABLE ehvp_messageinbound_handlers;
     TRUNCATE TABLE ehvp_messageinbound_messagelist;
     TRUNCATE TABLE ehvp_messages;
    
    • 0

relate perguntas

  • O que iniciaria o MariaDB para começar a resolver endereços IP?

Sidebar

Stats

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

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

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