Descartando o índice em 10GB + a tabela InnoDB leva mais de 4 horas

4

Esta é a tabela com a qual estou trabalhando:

CREATE TABLE IF NOT EXISTS 'checklist_answer' (
  'id' varchar(36) NOT NULL,
  'created_by' varchar(36) NOT NULL,
  'date_created' datetime NOT NULL,
  'updated_by' varchar(36) NOT NULL,
  'date_updated' datetime NOT NULL,
  'deleted' int(11) NOT NULL,
  'checklistresponse_id' varchar(36) NOT NULL,
  'question_id' varchar(36) NOT NULL,
  'questionoption_id' varchar(36) DEFAULT NULL,
  'value' varchar(256) NOT NULL,
  'source' int(11) NOT NULL,
  'award_id' varchar(36) DEFAULT NULL,
  PRIMARY KEY ('id'),
  KEY 'checklist_answer_1f92e550' ('question_id'),
  KEY 'checklist_answer_35e0d13d' ('questionoption_id'),
  KEY 'answerset' ('checklistresponse_id','deleted')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Atualmente, a tabela tem aproximadamente 20 milhões de linhas e tem cerca de 12 GB. Sempre que tento adicionar um novo índice ou eliminar um índice, demora no mínimo 4 horas. Existe algo que eu esteja fazendo errado ou é assim?

MySQL 5.1.49

Obrigado!

    
por Toby 04.09.2013 / 22:13

2 respostas

3

Se você estiver usando o InnoDB integrado do MySQL 5.1, a criação e a remoção do índice serão muito lentas. Isso foi resolvido em 5.5 com índices rápidos . Atualize o MySQL, se possível. Alternativamente, você pode substituir o InnoDB da 5.1 pelo InnoDB Plugin (embora isso já devesse ter sido feito; dado que você está tendo esse problema, provavelmente não estava).

    
por 05.09.2013 / 03:15
1

Veja os três campos "ID" de 36 bytes que você está INDEXizando.

Primeiramente, sugiro reduzir esses três para menos de 8 bytes e NÃO ASSINAR BIGINT; 4-byte UNSIGNED INT é ainda melhor se um número de 4 bilhões for grande o suficiente.

Se o campo "excluído" INT de 4 bytes estiver sendo usado como um sinalizador, isso pode ser alterado para um TINYINT de 1 byte.

Você pode tentar publicar:

ALTER TABLE checklist_answer DESABILITAR TECLAS;

/ *

 Make you table changes in here.

* /

ALTER TABLE checklist_answer HABILITAR TECLAS;

Juntos, eu não ficaria surpreso em ver o corte de "4 horas" pela metade.

Outros Performance-Killers aqui são: "ENGINE = InnoDB DEFAULT CHARSET = utf8;" .

Alterando isto para: "ENGINE = MYISAM DEFAULT CHARSET = latin1;" poderia reduzir o tempo pela metade novamente.

Os BIGINTs são matadores de desempenho em máquinas de 32 bits. A máquina de 64 bits executará o MariaDB 2.5 vezes mais rápido que em uma máquina de 32 bits.

    
por 18.09.2013 / 04:17