Eu recomendo armazenar tabelas InnoDB em arquivos separados, um arquivo por tabela. Torna mais fácil gerenciá-los e ver quais tabelas ocupam mais espaço de armazenamento. Coloque o seguinte em /etc/mysql/my.cnf (ou onde quer que esteja no seu sistema) [mysqld] seção:
innodb_file_per_table
Depois disso, é fácil identificar as tabelas que estão usando muito espaço. Então você precisa recriar a (s) tabela (s) problemática (s) periodicamente (uma vez por dia, uma vez por mês, qualquer coisa) fazendo o seguinte:
ALTER TABLE tablename ENGINE=InnoDB;
Isso levará algum tempo para ser executado em grandes tabelas. Ele recriará os arquivos da tabela a partir do zero e eliminará a fragmentação e os furos que se somam aos tamanhos dos arquivos. Enquanto o ALTER TABLE está sendo executado, ele usa o dobro da capacidade de disco necessária. Não tenho certeza se você pode fazer isso a menos que você esteja executando no modo "arquivo por tabela".
UPDATE
Eu queria acrescentar que para se livrar do arquivo inflado existente "arquivo único para todas as tabelas" do InnoDB ibdata1 , você precisa fazer o seguinte:
- exporta todas as tabelas InnoDB com o mysqldump
- desligamento do mysqld
- coloque a linha "innodb_file_per_table" no seu my.cnf
- rm ibdata * ib_logfile * no diretório de dados do mysql
- iniciar o mysqld
- importe seus dados dos quais você fez backup na etapa 1