Cache do banco de dados MySQL na memória

11

Estou tendo problemas com um site com 600 MB de banco de dados MySQL. O site está muito lento. Percebi que quanto maior o banco de dados MySQL, mais lento ele fica. Quando tinha 5 MB, o site era muito rápido. Quando começou a crescer, começou a ficar cada vez mais lento e agora, com 600 MB, é realmente lento, levando 10 segundos para carregar as páginas.

Eu verifiquei os principais processos e não tem nada a ver com alta carga ou algo assim. Nem sequer está relacionado ao IOPS, como testei em unidades HDD de 7.2k rpm e deu o mesmo problema agora ao testar com unidades SSD Intel 320, por isso também não acho que seja sobre consultas altas.

O site está usando o Wordpress e existem 9 plugins ativos. As pessoas disseram que podem ser os plugins ... bem, talvez ... mas agora eu só quero armazenar em cache todo o banco de dados na memória e gostaria de obter ajuda e orientação sobre por onde começar e como fazê-lo.

Tenho 16 GB de RAM e i5-2400 4 núcleos a 3,1 GHz. OS é centos 5.7

top - 07:23:57 up 9 days, 12:15, 0 users, load average: 0.09, 0.04, 0.05
Tasks: 162 total, 1 running, 161 sleeping, 0 stopped, 0 zombie
Cpu(s): 8.2%us, 1.0%sy, 0.0%ni, 90.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16367532k total, 3641628k used, 12725904k free, 612140k buffers
Swap: 1046520k total, 0k used, 1046520k free, 1538896k cached
conceder alfaiate
fonte

Respostas:

10

Se eu fosse você, trocaria todos os dados para o InnoDB. O bloqueio de tabela / bloqueio de linha tem sido discutido por muitos. Eu sempre escolheria o InnoDB de mãos dadas. No entanto, há outro motivo profundo para escolher o InnoDB ... CACHING .

Enquanto muitas pessoas se gabam de que o MyISAM é mais rápido para leituras, muitas pessoas esquecem que o muitos cache do MyISAM, que é chamado de cache de chaves (definido por key_buffer_size), apenas armazena em cache as páginas de índice dos arquivos .MYI. Ele nunca armazena em cache as páginas de dados. Possui um máximo oficial de 4 GB em sistemas de 32 bits. O máximo de 8 GB é o máximo para 64 bits.

O InnoDB Buffer Pool armazena em cache os dados e as páginas de índice. Dependendo do servidor que você possui, você pode armazenar em cache até todo o conjunto de dados na RAM. Você pode ajustar o InnoDB para até 80% de RAM e 10% para DB Conenctions e deixar 10% para o sistema operacional. Isso é verdade mesmo para diferentes sistemas operacionais .

Eu recomendei essas coisas para os clientes do Drupal com um sucesso maravilhoso. Também se aplica ao Wordpress . Forneci suporte ao banco de dados para clientes com WordPress. Mesmas melhorias.

Você sempre pode configurar a memória do InnoDB de maneira mais eficaz do que o MyISAM. Sempre existe uma maneira de usar o InnoDB para atender às suas necessidades de desempenho . À medida que seus dados crescem, eles acabam se tornando um requisito .

ATUALIZAÇÃO 21/11/2011 11:44 EST

Se seu conjunto de dados completo for pequeno o suficiente, você poderá executar uma consulta SELECT em todas as tabelas que você possui logo após o mysql iniciar.

Para todas as tabelas que são InnoDB e / ou MyISAM, execute esta consulta:

SELECT DISTINCT
    CONCAT('SELECT ',ndxcollist,' FROM ',
    db,'.',tb,' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM (
    SELECT
        engine,table_schema db,table_name tb,index_name,
        GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
    FROM (
        SELECT
            B.engine,A.table_schema,A.table_name,
            A.index_name,A.column_name,A.seq_in_index
        FROM
            information_schema.statistics A INNER JOIN
            (SELECT engine,table_schema,table_name
            FROM information_schema.tables
            WHERE engine IN ('InnoDB','MyISAM')) B
            USING (table_schema,table_name)
        WHERE
            B.table_schema NOT IN ('information_schema','mysql')
            AND A.index_type <> 'FULLTEXT'
        ORDER BY
            table_schema,table_name,index_name,seq_in_index
        ) A
    GROUP BY
        table_schema,table_name,index_name
) AA
ORDER BY
    engine DESC,db,tb
;

Isso produzirá todas as consultas SELECT possíveis que você precisa executar que invocam todos os índices a serem referenciados. Coloque esta consulta em um arquivo chamado /root/MakeSelectQueriesToLoad.sql. Execute o script e colete a saída /root/SelectQueriesToLoad.sql. Por fim, execute-o:

mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql

Isso definitivamente pré-carregará todas as páginas de índice no InnoDB Buffer Pool e no MyISAM Key Cache. Se todos os seus dados forem do InnoDB, faça duas alterações:

  • substitua WHERE engine IN ('InnoDB','MyISAM')porWHERE engine='InnoDB'
  • substitua CONCAT('SELECT ',ndxcollist,' FROM ',porCONCAT('SELECT * FROM ',

Isso também preencherá mais páginas de dados no InnoDB Buffer Pool.

NOTA FINAL: Verifique se o InnoDB Buffer Pool é grande o suficiente para armazenar todos os seus dados do InnoDB

RolandoMySQLDBA
fonte
2

Você já está armazenando em cache o banco de dados inteiro na memória. O problema é quase certamente o tempo que leva para pesquisar no banco de dados, mesmo na RAM.

Assista às estatísticas de E / S do disco. Você provavelmente verá que há apenas um bit aleatório ocasional de E / S de disco. O banco de dados está na memória. Esse não é o problema. Você precisa instalar iostatprimeiro. Você não menciona sua plataforma ou distribuição, mas provavelmente está em um pacote chamado iostat. Você pode achar atopmais amigável.

As pessoas que lhe disseram isso depois de obter qualquer evidência de que seu banco de dados inteiro ainda não estava na memória ou que a E / S do disco era o problema? Caso contrário, o conselho deles é o equivalente a um médico que nunca o viu ou o examinou, mas acabou de ouvir que seu braço doía dizendo para você dar um jeito nele.

Paul White 9
fonte
-1

Instale um bom plugin de cache para o Wordpress, isso pode ajudar. Mas, mais cedo ou mais tarde, você precisa descobrir o gargalo que atrasa o seu sistema.

fzsa
fonte