Назад | Перейти на главную страницу

Удаление индекса на таблице 10 ГБ + InnoDB занимает более 4 часов

Это таблица, с которой я работаю:

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

Спасибо!

Если вы используете встроенный в MySQL 5.1 InnoDB, создание и удаление индекса происходит очень медленно. Это было исправлено в 5.5 с быстрые индексы. По возможности обновите MySQL. В качестве альтернативы вы можете заменить встроенный InnoDB из 5.1 на плагин InnoDB (хотя это уже должно было быть сделано; учитывая, что у вас возникла эта проблема, вероятно, почему-то не было).

Посмотрите на три 36-байтовых поля «ID», которые вы индексируете.

Сначала я бы предложил сократить эти три до 8-байтового UNSIGNED BIGINT; 4-байтовое UNSIGNED INT даже лучше, если 4-миллиардное число достаточно велико.

ЕСЛИ 4-байтовое поле INT «удалено» используется в качестве флага, его можно изменить на 1-байтовое TINYINT.

Вы можете попробовать оформить:


ИЗМЕНИТЬ ТАБЛИЦУ checklist_answer ОТКЛЮЧИТЬ КЛЮЧИ;

/ *

 Make you table changes in here.

* /

ИЗМЕНИТЬ ТАБЛИЦУ checklist_answer ВКЛЮЧИТЬ КЛЮЧИ;


Вместе я не удивлюсь, увидев сокращение «4 часа» вдвое.

Другие убийцы производительности: "ENGINE = InnoDB DEFAULT CHARSET = utf8;".

Измените это на: "ENGINE = MYISAM DEFAULT CHARSET = latin1;" мог бы снова сократить время вдвое.

BIGINT убивают производительность на 32-битных машинах. 64-разрядная машина будет работать с MariaDB в 2,5 раза быстрее, чем на 32-разрядной машине.