A eliminação de um índice duplicado no MySQL estava demorando bastante, então, enquanto esperava, pesquisei sobre isso e encontrei esta postagem de 2006, falando sobre como o MySQL lida ADD
e DROP
indexa.
Se uma tabela T é uma tabela MySQL com quatro índices (ndx1,ndx2,ndx3,ndx4) e você deseja 'alter table T drop index ndx3;' aqui está exatamente o que acontece sob o capô:
1) O MySQL copia T.MYD para uma tabela temporária, ou seja, S.MYD e um S.MYI de zero byte. 2) MySQL faz 'alter table S add index ndx1 (...); 3) MySQL faz 'alter table S add index ndx2 (...); 4) MySQL faz 'alter table S add index ndx4 (...); 5) MySQL exclui T.MYD e exclui T.MYI 6) MySQL renomeia S.MYD para T.MYD e renomeia S.MYI para T.MYI
Isso ainda é verdade? O conselho dele ainda é válido?
Dada a mesma tabela MyISAM T com quatro índices (ndx1,ndx2,ndx3,ndx4) e você deseja 'alter table T drop index ndx3;' tente isso em vez disso:
1) criar tabela T1 como T; Isso cria uma tabela vazia T1 com índices ndx1,ndx2,ndx3 e ndx4. 2) alterar tabela T1 drop index ndx3; Isso descarta o índice ndx3 no T1 vazio, que deve ser instantâneo. 3) insira em T1 selecione * de T; Isso preencherá a tabela T e carregará todos os três (3) índices para T1 em uma passagem. 4) tabela drop table T; 5) alterar o nome da tabela T1 para T;
Como vocês lidam com a adição e remoção de índices de tabelas grandes?
Foi assim que o MySQL 4.x fez isso e costumava me irritar muito.
Na verdade, havia uma fórmula que calculei sobre quantas dessas manobras de índice eram necessárias
Boas notícias, o MySQL 5.x não faz isso!!!
Se o MySQL 5.x fizesse isso, eu seria um DBA do PostgreSQL hoje (sem ofensa ao PostgreSQL, ele é um RDBMS excelente por si só).
ATUALIZAR
Ai meu Deus, li o post!!! Esse post veio de mim !!!
Nunca pensei que alguém iria desenterrar este post.
Por favor, deixe coisas como esta mortas e enterradas. Agora estou tendo flashbacks!!!