Eu usei o MySQLTuner, que apontou que algumas tabelas estavam fragmentadas. eu usei
mysqlcheck --optimize -A
otimizar todas as tabelas. Consertou algumas tabelas, mas o MySQLTuner ainda encontra 19 tabelas fragmentadas. como posso ver quais tabelas precisam de desfragmentar? Talvez OPTIMIZE TABLE funcione onde o mysqlcheck não funcionou? Ou o que mais devo tentar?
Respostas:
a resposta curta:
A resposta "Você deve saber"
Em primeiro lugar, você deve entender que as tabelas Mysql são fragmentadas quando uma linha é atualizada, portanto é uma situação normal. Quando uma tabela é criada, digamos importada usando um dump com dados, todas as linhas são armazenadas sem fragmentação em muitas páginas de tamanho fixo. Quando você atualiza uma linha de comprimento variável, a página que contém esta linha é dividida em duas ou mais páginas para armazenar as alterações, e essas novas duas (ou mais) páginas contêm espaços em branco preenchendo o espaço não utilizado.
Isso não afeta o desempenho, a menos que a fragmentação cresça demais. O que é muita fragmentação, bem, vamos ver a consulta que você está procurando:
DATA_LENGTH e INDEX_LENGTH são o espaço que seus dados e índices estão usando, e DATA_FREE é a quantidade total de bytes não utilizados em todas as páginas da tabela (fragmentação).
Aqui está um exemplo de uma tabela de produção real
Nesse caso, temos uma tabela usando (896 + 316) = 1212 MB e temos dados em um espaço livre de 5 MB. Isso significa uma "taxa de fragmentação" de:
... Qual é uma "taxa de fragmentação" realmente baixa.
Eu tenho trabalhado com tabelas com uma proporção próxima de 0,2 (ou seja, 20% dos espaços em branco) e nunca percebi uma lentidão nas consultas, mesmo se eu otimizar a tabela, o desempenho será o mesmo. Mas aplicar uma tabela de otimização em uma tabela de 800 MB leva muito tempo e bloqueia a tabela por vários minutos, o que é impraticável na produção.
Portanto, se você considerar o que ganha em desempenho e o tempo perdido em otimizar uma tabela, prefiro NÃO OTIMIZAR.
Se você acha que é melhor para armazenamento, veja sua proporção e quanto espaço você pode economizar ao otimizar. Geralmente não é muito, então eu prefiro NÃO OTIMIZAR.
E se você otimizar, a próxima atualização criará espaços em branco dividindo uma página em duas ou mais. Mas é mais rápido atualizar uma tabela fragmentada do que uma não fragmentada, porque se a tabela estiver fragmentada, uma atualização em uma linha não necessariamente dividirá uma página.
Espero que isso ajude você.
fonte
Apenas para adicionar à resposta de Felipe-Rojas, você pode calcular a proporção de fragmentos como parte da consulta:
Se uma tabela estiver fragmentada com uma pequena porcentagem (menos de 5%?), Provavelmente você poderá deixá-la em paz.
Qualquer coisa maior e você precisará avaliar com base no uso do banco de dados, nas tabelas de bloqueio, etc., quanto à importância de desfragmentar a tabela.
fonte
A tabela Otimizar, de fato, resolverá o problema que você está tendo.
Se você tiver apenas alguns bancos de dados, poderá usar o PHPMyAdmin para percorrer todos os seus bancos de dados. Selecione as tabelas com sobrecarga e, em seguida, selecione para otimizar.
Se você tiver muitos bancos de dados, provavelmente será preferível outro método.
Eu uso a seguinte configuração de script PHP no cron para executar a cada hora.
fonte
mysqlcheck --optimize -A
é o mesmo que o SQLOPTIMIZE TABLE <tablename>;
Me deparei com esta página e achei as perguntas de Felipe-Rojas e sysadmiral muito úteis. Mas, no meu caso, eu estava executando a consulta no phpMyAdmin do WHM e obter apenas TABLE_NAME não foi tão útil, pois o banco de dados não estava listado e vários bancos de dados têm os mesmos nomes de tabela. Portanto, simplesmente adicionar
TABLE_SCHEMA
também fornecerá essa coluna.Mostra DB
Para "consertar", usei o link da tabela Defragment no phpMyAdmin para cada uma das tabelas que resultaram em "frag_ratio" alto para o qual o phpMyAdmin executa:
fonte
Uma tabela usando o InnoDB Engine do MySQL basicamente nunca precisa ser
OPTIMIZEd
.O valor
Data_free
da partir de qualquerinformation_schema.tables
ouSHOW TABLE STATUS
é muitas vezes diferente de zero, mesmo quando você acha que tem feito tudo o que você pode fazer desfragmentação sua mesa (s). Além disso, essa métrica é apenas uma das várias fragmentações que podem e ocorrem. (Além disso, espaço desperdiçado em blocos, desfazer listas, indexar BTrees versus dados BTrees, etc., etc.E
innodb_file_per_table
complica o uso deData_free
. Se a tabela estiver dentroibdata1
,Data_free
refere-se a todo o espaço de tabela; um número bastante inútil. Se a tabela estiver em seu próprio.ibd
arquivo, é provável que tenha alguns MB ou alguns por cento do tamanho da tabela, o que for maior.Somente se você excluiu muitas linhas e não pretende recarregar a tabela, pode valer a pena executar
OPTIMIZE TABLE
.PARTITIONs
também mostra uma quantidade perturbadora deData_free
, uma vez que cada partição normalmente mostra 4-7 MB "livre". E isso não vai embora.Por que desfragmentar?
innodb_file_per_table=1
. Mas, à medida que você adiciona linhas, você as recupera do sistema operacional.Data_free
.Uma nota de história. Quando eu estava ajudando DBAs com principalmente tabelas MyISAM, descobri talvez 2 entre 1.000 tabelas que eram ajudadas mensalmente
OPTIMIZE
. Desde então, trabalhei com milhares de tabelas do InnoDB e ainda encontrei um problema de desempenho que provavelmente seria ajudadoOPTIMIZE
. (Claro, houve problemas de espaço em disco queOPTIMIZE
podem ajudar, mas isso é complicado - geralmente o DBA não tem espaço em disco suficiente para executarOPTIMIZE
!)fonte