La eliminación del índice en una tabla InnoDB de más de 10 GB lleva más de 4 horas

La eliminación del índice en una tabla InnoDB de más de 10 GB lleva más de 4 horas

Esta es la mesa con la que estoy trabajando:

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;

Actualmente la tabla tiene aproximadamente 20 millones de filas y pesa aproximadamente 12 GB. Cada vez que intento agregar un nuevo índice o eliminar un índice, me lleva un mínimo de 4 horas. ¿Hay algo evidente que estoy haciendo mal o es así?

MySQL 5.1.49

¡Gracias!

Respuesta1

Si está utilizando el InnoDB integrado de MySQL 5.1, la creación y eliminación de índices son muy lentas. Esto se abordó en 5.5 coníndices rápidos. Actualice MySQL si es posible. Alternativamente puedesreemplace el InnoDB integrado desde 5.1 con el complemento InnoDB(aunque esto ya debería haberse hecho; dado que usted tiene este problema, probablemente de alguna manera no fue así).

Respuesta2

Mire los tres campos "ID" de 36 bytes que está INDEXANDO.

Primero sugeriría reducir esos tres a 8 bytes UNSIGNED BIGINT; 4 bytes UNSIGNED INT es incluso mejor si un número de 4 mil millones es lo suficientemente grande.

SI el campo "eliminado" INT de 4 bytes se utiliza como indicador, esto podría cambiarse a un TINYINT de 1 byte.

Puedes intentar emitir:


ALTERAR TABLA checklist_answerDESACTIVAR TECLAS;

/*

 Make you table changes in here.

*/

ALTERAR TABLA checklist_answerHABILITAR TECLAS;


Juntos, no me sorprendería ver que las "4 horas" se redujeran a la mitad.

Otros factores que matan el rendimiento aquí son: "MOTOR = InnoDB JUEGO DE CARACTERES PREDETERMINADO = utf8;".

Cambiando esto a: "ENGINE=MYISAM DEFAULT CHARSET=latin1;" Podría reducir el tiempo a la mitad nuevamente.

Los BIGINT matan el rendimiento en máquinas de 32 bits. Una máquina de 64 bits ejecutará MariaDB 2,5 veces más rápido que una máquina de 32 bits.

información relacionada