O que definir innodb_buffer_pool e por que ..?

20

Eu tenho 170 GB de InnoDBíndice e dados.

Eu tenho que reajustar o tamanho innodb_buffer_pool para obter melhor desempenho. O tamanho máximo da tabela de uma tabela do InnoDB (índice + dados) é 28 GB.

Então, qual deve ser o tamanho ideal de innodb_buffer_pool.

ATUALIZAR

nós vamos migrar nosso banco de dados local para ec2, então definiremos a RAM de acordo com as estatísticas atuais do innodb, por isso preciso do tamanho do buffer pool para que possamos ter RAM disponível lá.

O arquivo por tabela está ativado.

Eu estou usando uma máquina Linux.

Abdul Manaf
fonte
Qual a RAM disponível na máquina que não está sendo usada por outros processos? Você está usando Windows, Linux ou algo mais? Qual versão do MySQL você está usando? Por que o tamanho da tabela é limitado a 28 GB?
Craig Efrein
Não o tamanho da tabela é limited..I ter dado o tamanho da tabela até um ponto de time.it irá aumentar à medida que haverá inserções no futuro ..
Abdul Manaf

Respostas:

25

A maior tabela que você possui representa 16,47% (28/170) do total de dados. Mesmo que a tabela tenha sido altamente escrita e lida, nem todos os 28G da tabela são carregados no buffer pool em um determinado momento. O que você precisa calcular é quanto do InnoDB Buffer Pool é carregado a qualquer momento no DB Server atual .

Aqui está uma maneira mais granular de determinar innodb_buffer_pool_size para um novo servidor de banco de dados, considerando o conjunto de dados atualmente carregado no InnoDB Buffer Pool do servidor de banco de dados atual.

Execute o seguinte na sua Instância MySQL atual (servidor do qual você está migrando)

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data';  -- IBPDataPages 
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total'; -- IBPTotalPages
SHOW GLOBAL STATUS LIKE 'Innodb_page_size'; -- IPS

Execute a fórmula IBPPctFull = IBPDataPages * 100.0 / IBPTotalPages.

SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPTotalPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_total'); -- SELECT @IBPTotalPages;
SET @IBPPctFull = CAST(@IBPDataPages * 100.0 / @IBPTotalPages AS DECIMAL(5,2));
SELECT @IBPPctFull;

Se IBPPctFull for 95% ou mais, defina innodb_buffer_pool_size para 75% da RAM do servidor de banco de dados.

Se IBPPctFull é inferior a 95%, executar esta fórmula: IBPSize = IPS X IBPDataPages / (1024*1024*1024) X 1.05.

SET @IBPSize = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_page_size'); -- SELECT @IBPSize;
SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPSize = concat(ROUND(@IBPSize * @IBPDataPages / (1024*1024*1024) * 1.05, 2), ' GB' );
SELECT @IBPSize;

O número do IBPSize (em GB) é o número que melhor se ajusta ao seu conjunto de dados de trabalho real.

Agora, se o IBPSize ainda for muito grande para a maior configuração de RAM do Amazon EC2, use 75% da RAM do servidor de banco de dados do Amazon EC2.

RolandoMySQLDBA
fonte
Isso é realmente uma ótima informação .. Mais uma coisa que eu preciso saber como o MySQL Server carrega os dados e os índices no buffer pool, examinei a documentação e consegui que ele usasse LRU, mas como os carregava na memória, como se eu tivesse 2 GB para buffer pool, mas o tamanho da tabela solicitada na consulta é muito mais que isso .. ??
Abdul Manaf
Somente os dados e as páginas de índice necessários para satisfazer a consulta são carregados no buffer pool, não na tabela inteira. Páginas de dados e índice velhos são rodados fora baseado no algoritmo LRU listados na dev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html
RolandoMySQLDBA
Abdul, você deve seguir a resposta de Rolando, que responde melhor à sua pergunta do que à minha. Vou reescrever minha própria resposta só porque preciso ser mais claro.
Craig Efrein
13

Estou fornecendo esta resposta como informação complementar à resposta de Rolando abaixo.

Antes do servidor estar em produção

Calcule innodb_buffer_pool_size com base nas maiores tabelas mais usadas pelo MySQL. Para identificar as maiores tabelas com base em seu tamanho no banco de dados, você pode usar este script:

select table_schema, table_name, round(data_length/1024/1024,2) as size_mb 
from information_schema.tables where table_schema like 'my_database' 
order by size_mb desc;


+--------------+-------------------------+---------+
| table_schema | table_name              | size_mb |
+--------------+-------------------------+---------+
| heavybidder     | user                 |   522.55|
| heavybidder     | bid                  |   121.52|
| heavybidder     | item_for_sale        |    10.52|
| heavybidder     | account_user         |    5.02 |
| heavybidder     | txn_log              |    4.02 |
| heavybidder     | category             |    0.02 |
+--------------+-------------------------+---------+

Agora que sabemos quais tabelas são as maiores em nosso banco de dados, precisamos determinar quais são as mais usadas. Para fazer isso, eu usaria um programa de criação de perfil como o Jet Profiler (JP) para examinar quais tabelas estão sendo mais acessadas. O JP mostrará quais tabelas estão sendo acessadas com mais frequência. Aqui está uma captura de tela dessa seção no JP

insira a descrição da imagem aqui

Então, com isso em mente, agora eu sei que as tabelas de usuários e lances ocupam cerca de 640 MB de espaço em disco, elas são usadas com muita frequência de acordo com o JP e isso significa que o MySQL armazenará seus índices e dados no buffer pool como Rolando menciona abaixo em seus comentários.

Para garantir que o MySQL tivesse memória suficiente para armazenar dados para minhas tabelas maiores e mais frequentemente usadas, eu definiria innodb_buffer_pool_size em 640MB.

Existem algumas considerações adicionais, mas elas não se aplicam ao innodb_buffer_pool_size.

Este é um sistema de 32 bits ou 64 bits? Em um sistema de 32 bits, você está limitado a 4 GB, a menos que ative o PAE. No Windows, isso significa executar as edições Windows Enterprise ou Datacenter.

Quanta memória os outros processos em execução no seu sistema precisam? Em um servidor MySQL dedicado, deixarei entre 5% e 10% para o sistema operacional. No Windows, você pode usar o Process Explorer para analisar o uso da memória. No Linux, você possui sysstat, free, htop, top e vmstat.

O banco de dados é composto apenas de tabelas Innodb ou de uma mistura de Innodb e MyISAM? Se for uma mistura dos dois, reservarei memória para o key_cache, juntarei variáveis, cache de consultas, etc. Você poderá calcular posteriormente a taxa de acertos do MyISAM quando o servidor estiver em produção.

Após o servidor estar em produção

Qual é a taxa de acerto atual do Innodb?

1 - (innodb_buffer_pool_reads / innodb_buffer_pool_read_requests).

Qual é a taxa de acertos do cache de chaves

1 - (Key_reads / Key_read_requests)

Normalmente, tento obter a proporção o mais próximo possível de 100%.

Quão bem suas tabelas se encaixam no buffer pool

Você também pode ver como os dados da tabela se ajustam ao buffer_pool consultando este link, que fornece uma maneira de mostrar "quantas páginas há no buffer pool para uma determinada tabela (cnt), quantas estão sujas (sujas) e qual é a porcentagem de índice que cabe na memória (fit_pct). " Aplica-se apenas ao servidor Percona

http://www.mysqlperformanceblog.com/2010/12/09/how-well-does-your-table-fits-in-innodb-buffer-pool/

Craig Efrein
fonte