Verifique se há fragmentação em MySQL e corrigi-lo

O que são tabelas fragmentadas? Se houver inserções aleatórias em ou exclusões dos índices de uma tabela, os índices podem se tornar fragmentados. A fragmentação significa que a ordem física das páginas de índice no disco não está próxima a ordem do índice dos registros nas páginas ou que há muitas páginas sem uso no bloco de 64 páginas que foram alocados para o índice. Os sintomas de tabelas fragmentadas pode ser que a tabela pode ter mais espaço em disco do que o necessário ou os resultados pode retornar mais lento, com mais de disco I/O do que o necessário. Usuários INNODB precisa verificar a fragmentação muitas vezes, porque quando as marcas INNODB dados como excluído, ele nunca substitui os blocos com novos dados. Ele só os marca como inutilizável. Como resultado, o tamanho dos dados é artificialmente e recuperação de dados é retardado.

SELECT
TABLE_SCHEMA, TABLE_NAME, CONCAT(ROUND(data_length / ( 1024 * 1024 ), 2), 'MB') DATA,
CONCAT(ROUND(data_free  / ( 1024 * 1024 ), 2), 'MB')FREE
              from information_schema.TABLES
			       where TABLE_SCHEMA
				   NOT IN ('information_schema','mysql') and Data_free < 0;
  • Agora crie uma rotina de executar o script abaixo.
  •  #!/bin/bash
    
    MYSQL_LOGIN='-u<user name> --password=<passowrd>'
    
    for db in $(echo "SHOW DATABASES;" | mysql $MYSQL_LOGIN | grep -v -e "Database" -e "information_schema")
    do
            TABLES=$(echo "USE $db; SHOW TABLES;" | mysql $MYSQL_LOGIN |  grep -v Tables_in_)
            echo "Switching to database $db"
            for table in $TABLES
            do
                    echo -n " * Optimizing table $table ... "
                    echo "USE $db; OPTIMIZE TABLE $table" | mysql $MYSQL_LOGIN >/dev/null
                    echo "done."
            done
    done
    É importante lembrar que quando de-fragmentam uma tabela, o processo irá bloquear a tabela, por isso certifique-se de que você pode fazer esse bloqueio.