10GB 이상의 InnoDB 테이블에서 인덱스를 삭제하는 데 4시간 이상 소요

10GB 이상의 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;

현재 테이블에는 약 2천만 개의 행이 있으며 크기는 약 12GB입니다. 새 인덱스를 추가하거나 인덱스를 삭제하려고 할 때마다 최소 4시간이 걸립니다. 내가 잘못하고 있는 게 눈에 띄는 걸까요, 아니면 그냥 그런 걸까요?

MySQL 5.1.49

감사해요!

답변1

MySQL 5.1에 내장된 InnoDB를 사용하는 경우 인덱스 생성 및 제거 속도가 매우 느립니다. 이 문제는 5.5에서 해결되었습니다.빠른 인덱스. 가능하다면 MySQL을 업데이트하세요. 또는 다음을 수행할 수 있습니다.5.1의 내장 InnoDB를 InnoDB 플러그인으로 교체(이미 완료했어야 했지만 이 문제가 발생했다는 점을 고려하면 아마도 그렇지 않았을 것입니다.)

답변2

인덱싱 중인 3개의 36바이트 "ID" 필드를 살펴보세요.

먼저 이 세 개를 8바이트 UNSIGNED BIGINT로 줄이는 것이 좋습니다. 40억 숫자가 충분히 크다면 4바이트 UNSIGNED INT가 더 좋습니다.

4바이트 INT "삭제" 필드가 플래그로 사용되는 경우 이는 1바이트 TINYINT로 변경될 수 있습니다.

다음을 발행해 볼 수 있습니다.


테이블 checklist_answer비활성화 키 변경;

/*

 Make you table changes in here.

*/

테이블 checklist_answer활성화 키 변경;


함께, 나는 "4시간"이 반으로 줄어든 것을 보고 놀라지 않을 것입니다.

기타 성능 저하 요소는 다음과 같습니다. "엔진=InnoDB 기본 문자 집합=utf8;".

이를 "ENGINE=MYISAM DEFAULT CHARSET=latin1;"으로 변경합니다. 시간을 다시 절반으로 줄일 수 있습니다.

BIGINT는 32비트 시스템의 성능을 저하시키는 요소입니다. 64비트 시스템은 32비트 시스템보다 MariaDB를 2.5배 빠르게 실행합니다.

관련 정보