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는 최적화를 지원하지 않기 때문에 강제로 다시 빌드하고 문제를 해결했습니다. 아마도 나는 손상된 색인을 가졌을 것입니까?하여 UPDATE
문 id
에 인덱스를 사용하지 않을 가능성이 있습니다
mysqlcheck -A -o -u <user> -p
주말에 테스트를 추가 한 후에 갑자기 변경된 사항을 파악할 수 없었습니다. 이 스크립트는 이전 기록과 비교해 실행하기에는 너무 오래 걸립니다. 나는 생산 기계를 완전히 다시 시작했다. –