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 / 18975
Accepted
Abdul Manaf
Abdul Manaf
Asked: 2012-06-08 22:48:45 +0800 CST2012-06-08 22:48:45 +0800 CST 2012-06-08 22:48:45 +0800 CST

Como melhorar o desempenho do servidor MySQL..?

  • 772

Como DBA MySQL, na maioria das vezes, devemos otimizar servidores MySQL com baixo desempenho.

Agora, minha pergunta é por onde começar, pois precisaremos descobrir muitas coisas como

1.Find the duplicate indexes.
2.Find unused indexes on the basis of selectivity.
3.Monitor the Server Parameters(What should be important parameters).
4.Execute MySQL Server performance tuning script.
5.Slow logs

Então, qual deve ser a ordem de examinar o servidor e quais devem ser as coisas exatas que devem ser monitoradas/analisadas para melhorar o desempenho.

mysql performance
  • 1 1 respostas
  • 5081 Views

1 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2012-06-09T10:24:41+08:002012-06-09T10:24:41+08:00

    Encontrando Índices Duplicados

    Em janeiro de 2012, @gbn respondeu a uma pergunta sobre índices duplicados, onde apresentou 2 visualizações que vieram do blog de Ronald Bradford . Combinei as duas exibições em uma única consulta para apresentar índices duplicados da seguinte maneira:

    SELECT
        ndx1.TABLE_SCHEMA,ndx1.TABLE_NAME,
        CASE 
            WHEN ndx1.COLUMNS = ndx2.COLUMNS
            AND (ndx1.IS_UNIQUE = ndx2.IS_UNIQUE) 
            THEN GREATEST(ndx1.INDEX_NAME, ndx2.INDEX_NAME) 
            ELSE ndx1.INDEX_NAME 
        END REDUNDANT_INDEX_NAME,
        GROUP_CONCAT(DISTINCT 
            CASE 
                WHEN ndx1.COLUMNS = ndx2.COLUMNS
                AND (ndx1.IS_UNIQUE = ndx2.IS_UNIQUE) 
                THEN LEAST(ndx1.INDEX_NAME, ndx2.INDEX_NAME) 
                ELSE ndx2.INDEX_NAME 
            END
        ) INDEX_NAME 
    FROM
    (
        SELECT
            TABLE_SCHEMA,TABLE_NAME,INDEX_NAME,INDEX_TYPE,
            IF(NON_UNIQUE, 'NO', 'YES') IS_UNIQUE,
            GROUP_CONCAT(CONCAT('`',COLUMN_NAME,'`')
            ORDER BY IF(INDEX_TYPE='BTREE',SEQ_IN_INDEX,0), COLUMN_NAME
            ) COLUMNS 
        FROM
            information_schema.STATISTICS 
        GROUP BY
            TABLE_SCHEMA,TABLE_NAME,INDEX_NAME,INDEX_TYPE,NON_UNIQUE 
    ) ndx1 INNER JOIN 
    (
        SELECT
            TABLE_SCHEMA,TABLE_NAME,INDEX_NAME,INDEX_TYPE,
            IF(NON_UNIQUE, 'NO', 'YES') IS_UNIQUE,
            GROUP_CONCAT( 
            CONCAT('`',COLUMN_NAME,'`') 
            ORDER BY IF( INDEX_TYPE = 'BTREE'
            , SEQ_IN_INDEX
            , 0) 
            , COLUMN_NAME
            ) COLUMNS 
        FROM
            information_schema.STATISTICS 
        GROUP BY
            TABLE_SCHEMA,TABLE_NAME,INDEX_NAME,INDEX_TYPE,NON_UNIQUE 
    ) ndx2
    ON ndx1.TABLE_SCHEMA = ndx2.TABLE_SCHEMA
    AND ndx1.TABLE_NAME = ndx2.TABLE_NAME 
    AND ndx1.INDEX_NAME != ndx2.INDEX_NAME
    AND ndx1.INDEX_TYPE = ndx2.INDEX_TYPE 
    AND CASE 
    WHEN ndx1.COLUMNS = ndx2.COLUMNS
    AND (ndx1.IS_UNIQUE = 'NO'
    OR ndx1.IS_UNIQUE = ndx2.IS_UNIQUE)
    THEN TRUE 
    WHEN ndx1.INDEX_TYPE = 'BTREE' -- when BTREE 
    AND INSTR(ndx2.COLUMNS, ndx1.COLUMNS) = 1
    AND ndx1.IS_UNIQUE = 'NO'
    THEN TRUE 
    ELSE FALSE 
    END 
    GROUP BY ndx1.TABLE_SCHEMA,ndx1.TABLE_NAME,REDUNDANT_INDEX_NAME
    ;
    

    Obviamente, os índices com menos coluna por agrupamento precisam ser eliminados

    Encontre índices não utilizados com base na seletividade.

    Não fiz muito com índices não utilizados em meus dias de desenvolvedor. Eu tento fazer apenas índices necessários que correspondam às seguintes cláusulas:

    • ONDE
    • GRUPO POR
    • ORDENAR POR

    No caso de você precisar limpar um banco de dados procurando índices não utilizados, leia estes:

    • Use o Percona-Server em vez do MySQL porque o Percona-Server possui tabelas information_schema adicionais que registram o uso do índice desde a inicialização do mysql.
      • http://www.mysqlperformanceblog.com/2009/06/26/check-unused-keys-a-tool-to-interact-with-index_statistics/
      • https://stackoverflow.com/a/3243517/491757
    • Uma ferramenta muito antiga chamada mysqlidxchk

    Monitore os Parâmetros do Servidor (Quais devem ser parâmetros importantes)

    • Innodb_buffer_pool_pages_dirty *100.0/ Innodb_buffer_pool_pages_total : Porcentagem do pool de buffer InnoDB que precisa ser liberado (eu ficaria de olho na carga do servidor se isso excedesse 5%)
    • (100,0 * (Delta( Innodb_buffer_pool_read_requests ) - Delta( Innodb_buffer_pool_reads ))) / Delta( Innodb_buffer_pool_read_requests : Eficiência de leitura do InnoDB
    • 100.0 * (1.0 - (Delta([Key_reads]) / Delta([Key_read_requests])): Read Efficiency Of MyISAM (deve estar acima de 90%, qualquer coisa menos, procure armazenar dados em cache com memcached ou mudar para InnoDB)

    Esta é apenas uma amostra do tipo de valores de status globais a serem monitorados. Por favor, leia a documentação do MySQL nas variáveis ​​de status do servidor .

    Execute o script de ajuste de desempenho do MySQL Server

    O script mais direto é mysqltuner.pl Basta obtê-lo e executá-lo

    # wget mysqtuner.pl
    # perl mysqltuner.pl
    

    Registros lentos

    Logs lentos podem ser bastante úteis em um ambiente de baixo tráfego. Infelizmente, tenho visto muitas ocorrências do seguinte

    • Alto número de conexões de banco de dados
    • Todas as conexões executando o mesmo tipo de consulta
    • Consulta em uma conexão bloqueando dezenas de outras que precisam da mesma tabela ou linha (mesmo com InnoDB devido a problemas de deadlock associados ao Clustered Index ao fazer UPDATEs )

    Diante desse cenário, tenho consultas que funcionam de forma independente com uma velocidade incrível param quando uma infinidade de consultas precisa de tabelas comuns.

    IMHO, o log de consulta lento, na verdade, não é bom porque registra consultas concluídas que são consideradas lentas. O que você realmente deseja fazer é capturar consultas de longa duração no ato de serem de longa duração. Portanto, eu recomendaria usar pt-query-digest para agrupar a lista de processos (ou tmpdump) para consultas em execução descontrolada. Escrevi uma postagem em dezembro de 2011 sobre como criar um script de trabalho crontab que pesquisa a lista de processos a cada 20 minutos usando mk-query-digest (pt-query-digest pode ser inserido nele).

    • 7

relate perguntas

  • 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

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 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

    Como selecionar a primeira linha de cada grupo?

    • 6 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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