이슈노트 #4: mysql insert 성능악화 문제

1. 발단

어느 시점부터 특정 insert 쿼리가 심각하게 느려지는 문제가 발생했다.

그냥 한번에 3개 정도만 삽입하는 단순한 쿼리임에도 몇초~수십초까지 실행시간이 지연되었다.

비정상적인 상황임은 명백했다.




2. 분석

데이터베이스 환경은 AWS MySQL 8.0.23이었다.

문제가 발생한 테이블은 컬럼 3개, 인덱스는 5개, 유니크 1개, 기본키 1개, 외래키 2개가 걸려있는 매우 단순한 구조의 테이블이었다.

다만 삽입과 삭제가 매우 잦게 일어나서 auto_increment가 int 4바이트 한계치인 21억에 가까운 "9억"을 넘은 상태이긴 했다.

그리고 성능 저하는 순수하게 update 동작 자체에서만 발생하는듯했다.




3. 시도

그래서 우리는 성능을 저해할만한 요소를 최대한 덜어내보기로 했다.

일단 외래키를 다 날리고, 불필요한 인덱스를 2개 제거했다.

하지만 그럼에도 사태는 해결되지 않았다.




4. 해결

너무나 비정상적인 동작에, 우리는 그냥 기존에 있던걸 날리고 동일한 테이블을 다시 만들어서 사용해보기로 했다.

그래서 동일한 컬럼과 제약조건을 가진 테이블을 만들어 데이터를 옮기는데...

**insert into 새테이블(...) **
select ... from 옛날테이블;

위 쿼리에서 오류가 발생했다. 데이터의 중복이 발생했다는 것이다.
둘다 같은 제약조건을 갖고있는데!

이건 기존 테이블의 unique가 제대로 동작하지 않았다는 것으로밖에 해석이 되지 않았다.
mysql 자체의 버그인 것이다.

처음에 테이블을 만들때부터인지, 나중에 그렇게 된건지는 몰라도 unique 키가 망가졌던 것이다.

황당한 해결이었다.




5. 결론

어떻게 해도 안될때는 리셋이 답이다.