Como estimar as operações de E / S executadas pelas consultas do MySQL?

13

No RDS da Amazon, você paga cerca de US $ 0,10 por 1 milhão de solicitações de E / S. Percebi um número muito alto (em centenas de milhares) de solicitações de E / S para um banco de dados de tráfego muito baixo. Ao ver isso, fiz uma pesquisa mais aprofundada e encontrei esta pergunta que descreve que, para um site de 6.000 usuários, ele estava gerando 800 milhões de solicitações de E / S por mês, o que lhe custaria cerca de US $ 80 / mês.

Portanto, quero saber com antecedência quantas operações de E / S uma consulta MySQL geraria e como otimizá-las / minimizá-las. Existe alguma maneira de estimar quantas operações de E / S uma consulta executaria e quaisquer regras gerais que eu possa seguir para mantê-las o mais baixo possível?

Click Voto a favor
fonte

Respostas:

2

Resposta do Community Wiki gerada a partir de comentários sobre a pergunta de Raymond Nijland

Use EXPLAIN. Dessa forma, você pode ver se uma consulta PODE precisar de disco IO. Você precisa evitar na coluna extra "Usando temporário" ou "" Usando temporário; Usando filesort (observe que filesort é um nome enganoso: se o conjunto de resultados couber na memória, o quicksort é executado na memória) ".

É mais provável que isso seja causado por subconsultas / uniões / ordem por / agrupar por / ... Se o resultado for grande e uma tabela temporária baseada em disco do MyISAM for criada, e você precisar classificar o resultado, está classificando o resultado definido com base nas leituras de E / S e gravações de E / S com o algoritmo quicksort.

Em Uso de tabela temporária interna no MySQL, você pode ler quando o MySQL precisar criar uma tabela MyISAM baseada em disco. Talvez você possa usar linhas avg_row_length * (embora observe que o valor das linhas de explicação não é exato no mecanismo do InnoDB) para verificar se o resultado se encaixa na pilha. Consulte Sintaxe SHOW TABLE STATUS .

Em geral, o InnoDB ou o MyISAM é melhor para evitar solicitações de E / S?

O InnoDB armazenará em buffer os dados da tabela e os dados do índice, enquanto o MyISAM somente armazenará em buffer as chaves do índice. Uma E / S para os dados da tabela é necessária quando a coluna de explicação extra não diz "Usando índice".

Se ambos estiverem usando índices: Com o InnoDB, se o buffer estiver quente, ele poderá carregar dados da memória. Se os índices precisarem vir do disco, existe uma fórmula que você pode usar para calcular leituras de E / S necessárias para seleções, inserções e atualizações. De Estimativa de desempenho de consulta :

Para tabelas pequenas, geralmente você pode encontrar uma linha em uma busca de disco (porque o índice provavelmente está armazenado em cache). Para tabelas maiores, é possível estimar que, usando índices da árvore B, você precisa deste número de buscas para encontrar uma linha:

log(rows) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1

Os índices do InnoDB são maiores porque armazenam dados da chave PRIMARY / UNIQUE em um índice KEY. Isso é mais rápido e precisa de menos procura de E / S, mas você pode compactar dados ou índices do InnoDB.

Paul White
fonte