Reduzindo o tamanho da tabela MyISAM

3

Eu tenho uma tabela MyISAM que atualmente contém cerca de 54 milhões de registros e tem 20 GB de tamanho. Escolhas pobres foram feitas quando este banco de dados foi projetado. Eu não sou DB pro, mas como esta tabela está sendo constantemente escrita e raramente consultada, parece que o InnoDB teria sido uma escolha melhor. O problema é que esta tabela deve estar disponível para gravação quase sempre. Um dos campos é um campo com registro de data e hora. Os registros duram 5 anos - eu só preciso manter os últimos 6 meses. Eu tentei algumas exclusões, demora cerca de 20 minutos para excluir 200.000 linhas durante o qual a tabela está bloqueada e não pode ser gravada. Alguém tem sugestões sobre como posso reduzir o tamanho dessa tabela sem que ela seja bloqueada por várias horas? Existe uma maneira mais rápida de excluir as linhas desnecessárias? Eu nunca converti uma tabela MyISAM para uma tabela InnoDB. Este é um processo demorado?

    
por Matt Southward 04.03.2015 / 19:29

2 respostas

1

Eu finalmente tive tempo de rever este projeto e por causa da perfeição queria postar o que acabei fazendo. O problema original com o DELETE FROM demorando tanto, acredito, está relacionado a como eu estava especificando linhas a serem deletadas. Eu estava usando uma declaração semelhante a

DELETE FROM table WHERE starttime < 20150101 limit 200000;

O campo de hora de início é, na verdade, um DATETIME. Acabei criando uma nova tabela usando

CREATE TABLE new_table LIKE existing_table;

e, em seguida, alterando o mecanismo da nova tabela

ALTER TABLE new_table ENGINE=InnoDB;

e, em seguida, renomeie

RENAME TABLE existing_table TO old_table, new_table TO existing_table;

Depois disso, precisei obter 6 meses de dados da tabela antiga para a nova tabela

INSERT INTO existing_table SELECT * FROM old_table WHERE starttime BETWEEN DATE_SUB(NOW(), INTERVAL 6 MONTH) AND NOW();

Obrigado Martin pela sugestão. Sou novo no serverfault, por isso não sei como marcar o comentário dele como resposta.

    
por 06.07.2015 / 18:44
1

MyISAM só é bom para o SELECT. Innodb tem fila de leitura e gravação separadas. Então, quando você estiver excluindo 200.000 linhas, as tabelas não serão bloqueadas. Bloqueios de mesa é a grande limitação do MyISAM quando chega a produção. O InnoDB é mais lento que o MyISAM para a maioria dos usos, mas pode executar mais rápido em certas condições devido a um melhor mecanismo de travamento; MyISAM bloqueia a tabela inteira para leitura enquanto inserções / atualizações estão sendo executadas. O InnoDB pode fazer o bloqueio em nível de linha, permitindo várias gravações simultâneas e leitura na tabela

link

Convertendo MyISAM para INNODB

Você pode fazer isso tabela por tabela

ALTER TABLE table_name ENGINE=InnoDB;

Ou você pode tentar script para fazer tudo de uma vez

link

    
por 04.03.2015 / 20:29

Tags