2011-01-09 3 views
1

이 쿼리는 mysql slow query log에 표시됩니다. 11 초가 걸립니다.왜이 쿼리가 너무 느린가요?

INSERT INTO record_visits 
(record_id, visit_day) 
VALUES 
('567', NOW()); 

표는 501,043 기록을 가지고 있으며 구조는 다음과 같습니다이다 :

CREATE TABLE IF NOT EXISTS `record_visits` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `record_id` int(11) DEFAULT NULL, 
    `visit_day` date DEFAULT NULL, 
    `visit_cnt` bigint(20) DEFAULT '1', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `record_id_visit_day` (`record_id`,`visit_day`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; 

은 무엇 잘못 될 수 있을까? 왜이 INSERT가 오래 걸리나요?

UPDATE

나는 모든 문제의 원인이 무엇인지, 발견했다. 해당 테이블에 매우 많은 "INSERT"트리거가 생성되었습니다. MyISAM 테이블 잠금과 함께, INSERT 쿼리를위한 엄청난 쿼리 시간을 가져 왔습니다. 아마 이런 이유로 @Oswald가이 상황을 재현 할 수 없었습니다.

실제 문제는 MySQL이 트리거 내부에서 쿼리를 기록하지 않으며 응용 프로그램을 프로파일 링 할 때 항상 기억해야한다는 것입니다.

도움을 주셔서 감사합니다. 모두에게 해결책을 제시하는 답변을 수락합니다.

+0

MySQL 서버 도움말을 다시 시작 하시겠습니까? –

+1

아마도 UNIQUE 색인 때문일 것입니다. 그러나 그렇게 천천히해서는 안됩니다. – alexn

+0

@Time 컴퓨터 아니요, 다시 시작한 후에도 여전히 동일합니다. –

답변

2

느린 쿼리 자체는 아니지만 테이블을 잠그는 서버에서 다른 쿼리를 실행하고 있다고 판단됩니다. MyISAM은 테이블 수준 잠금을 사용하므로 주어진 테이블을 필요로하는 쿼리는 다른 행을 터치하더라도 테이블을 필요로하는 다른 모든 쿼리를 잠급니다. 예를 들어, 장기 실행 SELECT 쿼리가 자주있는 경우 INSERT, UPDATE 및 DELETE 쿼리는 쿼리를 실행할 때 실행중인 모든 선택이 완료 될 때까지 실행할 수 없습니다.

삽입 실행 중에 다른 프롬프트에서 SHOW PROCESSLIST (을)를 말하는 경우 "잠긴"상태에 있음을 볼 수 있습니다. 다른 상태로 판명되고 장기 실행 선택 차단이 없다면 문제를 좁히는 데 도움이되므로 게시해야합니다.

0

MySQL을 모르지만 UNIQUE KEY는 visit_day 열에 인덱스가 있음을 의미합니까? 그렇지 않은 경우 생성하십시오.

+0

UNIQUE KEY는'record_id'와 'visit_day' 컬럼에 2 컬럼 인덱스가 있음을 의미합니다. 내가 아는 한, 인덱스를 추가하면 삽입 및 업데이트 속도가 느려지는데 어떻게 도움이 될까요? –

+0

삽입 할 때마다 고유 한 키를 확인해야합니다. 따라서 고유 한 키는 있으나 인덱스가없는 경우, 모든 인덱스는 키 컬럼을 순차적으로 스캔하여 중복 값이 ​​없는지 확인합니다. – Daniel

+0

고유 한 선언을 잘못 읽었지 만 두 키에 결합 된 인덱스가 필요하다고 가정합니다. – Daniel

1

이 테이블에 데이터를 추가 할 때 mysql은 UNIQUE 인덱스로 인해 record_id_visit_day 행을 모두 확인합니다.

관련 문제