A eliminação do índice na tabela InnoDB de 10 GB + leva mais de 4 horas

A eliminação do índice na tabela InnoDB de 10 GB + leva mais de 4 horas

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 cerca de 12 GB. Sempre que tento adicionar um novo índice ou eliminar um índice, leva no mínimo 4 horas. Há algo evidente que estou fazendo de errado ou é assim mesmo?

MySQL 5.1.49

Obrigado!

Responder1

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

Responder2

Observe os três campos "ID" de 36 bytes que você está indexando.

Eu sugeriria primeiro reduzir esses três para UNSIGNED BIGINT de 8 bytes; UNSIGNED INT de 4 bytes é ainda melhor se um número de 4 bilhões for grande o suficiente.

SE o campo INT "excluído" de 4 bytes estiver sendo usado como um sinalizador, ele poderá ser alterado para um TINYINT de 1 byte.

Você pode tentar emitir:


ALTER TABLE checklist_answerDISABLE KEYS;

/*

 Make you table changes in here.

*/

TECLAS DE HABILITAÇÃO DE ALTERAÇÃO DA TABELA checklist_answer;


Juntos, eu não ficaria surpreso em ver as “4 horas” cortadas pela metade.

Outros assassinos de desempenho aqui são: "ENGINE=InnoDB DEFAULT CHARSET=utf8;".

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

BIGINTs são matadores de desempenho em máquinas de 32 bits. Uma máquina de 64 bits executará o MariaDB 2,5 vezes mais rápido do que uma máquina de 32 bits.

informação relacionada