2011-04-22 4 views
1

MySQL 5.1, Ubuntu 10.10 64 비트, Linode 가상 머신.MySQL 업데이트 성능이 갑자기 심해져

모든 테이블은 InnoDB입니다.

우리의 생산 시스템 중 하나는 31 개의 관련 테이블을 포함하는 MySQL 데이터베이스를 사용합니다. 하나의 표에는 조건에 따라 하루에 여러 번 변경할 수있는 표시 값이 들어있는 필드가 있습니다.

이러한 표시 값 변경은 사용 시간 동안 하루 종일 지연 적용됩니다. 스크립트는 주기적으로 실행되어 변경을 초래할 수있는 몇 가지 저렴한 조건을 검사하고 조건이 충족 될 경우 표시 값을 업데이트합니다. 그러나이 지연 메소드는 작업 시간 동안 백그라운드 프로세스로드를 최소로 유지하기 위해 표시 값을 업데이트해야하는 모든 가능한 시나리오를 포착하지 않습니다.

한 번씩 스크립트는 테이블에 저장된 모든 표시 값을 제거하고 모든 값을 다시 계산하므로 가능한 모든 변경 사항을 포착합니다. 이것은 훨씬 더 비싼 작업입니다.

약 6 개월 동안 계속 실행되었습니다. 갑자기 3 일 전에 야간 스크립트의 실행 시간이 평균 40 초에서 11 분으로 늘어났습니다.

저장된 데이터의 전체 비율은 크게 변경되지 않았습니다.

나는 가능한 한 최선을 다했으며, 갑자기 느린 속도로 실행되는 부분은 새로운 표시 값을 쓰는 마지막 업데이트 명령문입니다. 행의 (INT (11)) ID와 새 표시 값 (INT)이 주어진 경우 행당 한 번 실행됩니다.

update `table` set `display_value` = ? where `id` = ? 

재미있는 것은이 모든 이전 값의 퍼지과 같이 실행된다 :

update `table` set `display_value` = null 

그리고이 사항이 여전히 항상 같은 속도로 실행됩니다.

display_value 필드의 색인이 생성되지 않습니다. id이 기본 키입니다. 실행 중 어느 시점에서도 수정되지 않은 다른 외래 키가 table에 있습니다.

그리고 마지막 커브 볼 :이 스키마를 테스트 VM에 덤프하고 동일한 스크립트를 실행하면 40 분 안에 실행되지만 11 분이 아닙니다. 프로덕션 시스템에서 스키마를 다시 작성하려고 시도하지 않았습니다. 단순히 장기적인 솔루션이 아니기 때문에 여기에서 무슨 일이 일어나고 있는지 이해하고 싶습니다.

내 색인과 관련이 있습니까? 같은 행에 수천 건의 업데이트가 있은 후에 그들은 뭉툭 해지지 않습니까?


업데이트

나는 완전히 스키마에 최적화 실행하여이 문제를 해결할 수 있었다. InnoDB는 최적화를 지원하지 않기 때문에 강제로 다시 빌드하고 문제를 해결했습니다. 아마도 나는 손상된 색인을 가졌을 것입니까?하여 UPDATEid에 인덱스를 사용하지 않을 가능성이 있습니다

mysqlcheck -A -o -u <user> -p 
+0

주말에 테스트를 추가 한 후에 갑자기 변경된 사항을 파악할 수 없었습니다. 이 스크립트는 이전 기록과 비교해 실행하기에는 너무 오래 걸립니다. 나는 생산 기계를 완전히 다시 시작했다. –

답변

2

은, 그러나, 당신 같은 쿼리 (가능한 모든 경우에) 매우 희한합니다.

테이블이 장기 실행 동시 쿼리/DML에 의해 잠길 수 있습니까? 어떤 엔진이 테이블을 사용합니까?

또한 레코드 레코드를 업데이트하는 것은 효율적이지 않습니다. 값을 일괄 적으로 임시 테이블에로드하고 하나의 명령으로 주 테이블을 업데이트 할 수 있습니다.

CREATE TEMPORARY TABLE tmp_display_values (id INT NOT NULL PRIMARY KEY, new_display_value INT); 

INSERT 
INTO tmp_display_values 
VALUES 
(?, ?), 
(?, ?), 
…; 

UPDATE `table` dv 
JOIN tmp_display_values t 
ON  dv.id = t.id 
SET  dv.new_display_value = t.new_display_value; 
+0

답장을 보내 주셔서 감사합니다. 모든 테이블은 InnoDB이다. 실행 시점에는 다른 쿼리를 실행해서는 안됩니다. 고객 기반이 모두 잠 들어 있으며 다른 자동화 된 프로세스가 실행되고 있지 않습니다. 저는 비효율에 대해 알고 있습니다. 그것은 지금까지 결코 고려되지 않았습니다. –

+0

스키마를 다시 작성하여 문제를 해결할 수 있었지만 성능에 대한 요점은 여전히 ​​유효하므로 응답을 솔루션으로 표시했습니다. 감사! –