Вот таблица, с которой я работаю:
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;
В настоящее время таблица содержит около 20 миллионов строк и занимает около 12 ГБ. Всякий раз, когда я пытаюсь добавить новый индекс или удалить индекс, это занимает минимум 4 часа. Есть ли что-то явно неправильное, что я делаю, или это просто так?
MySQL 5.1.49
Спасибо!
решение1
Если вы используете встроенный в MySQL 5.1 InnoDB, то создание и удаление индекса происходит очень медленно. Это было исправлено в 5.5 с помощьюбыстрые индексы. Обновите MySQL, если это возможно. В качестве альтернативы вы можетезаменить встроенный InnoDB из версии 5.1 на плагин InnoDB(хотя это уже должно было быть сделано; учитывая, что у вас возникла эта проблема, вероятно, этого по какой-то причине не было сделано).
решение2
Посмотрите на три 36-байтовых поля «ID», которые вы ИНДЕКСИРУЕТЕ.
Я бы сначала предложил сократить эти три до 8-байтового UNSIGNED BIGINT; 4-байтовый UNSIGNED INT будет даже лучше, если число в 4 миллиарда достаточно велико.
ЕСЛИ 4-байтовое поле INT «deleted» используется в качестве флага, его можно изменить на 1-байтовое TINYINT.
Вы можете попробовать выдать:
ИЗМЕНИТЬ ТАБЛИЦУ checklist_answer
ОТКЛЮЧИТЬ КЛЮЧИ;
/*
Make you table changes in here.
*/
ИЗМЕНИТЬ ТАБЛИЦУ checklist_answer
ВКЛЮЧИТЬ КЛЮЧИ;
В целом я не удивлюсь, если «4 часа» сократятся вдвое.
Другие «убийцы производительности»: "ENGINE=InnoDB НАБОР СИМВОЛОВ ПО УМОЛЧАНИЮ=utf8;".
Изменение этого на: "ENGINE=MYISAM DEFAULT CHARSET=latin1;" может сократить время еще вдвое.
BIGINT — это «убийцы» производительности на 32-битных машинах. На 64-битной машине MariaDB будет работать в 2,5 раза быстрее, чем на 32-битной машине.