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_answer
DESACTIVAR TECLAS;
/*
Make you table changes in here.
*/
ALTERAR TABLA checklist_answer
HABILITAR 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.