제가 작업하고 있는 테이블은 다음과 같습니다.
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배 빠르게 실행합니다.