데이터베이스에서 가장 자주 쓰이는 쓰기 연산은 INSERT와 UPDATE이다. 두 연산은 모두 데이터를 변경한다는 공통점이 있지만, 내부 동작 방식이 다르기 때문에 성능 차이가 발생한다.
INSERT는 새로운 행을 추가하는 연산이다.
동작 과정은 비교적 단순하다. 먼저 인덱스를 검사해 중복된 키가 없는지 확인한다. 이후 새로운 row를 데이터 파일과 인덱스에 기록하고, 트랜잭션 로그(binlog, redo log)에 남긴다. 마지막으로 commit으로 마무리된다.
INSERT INTO users (id, name) VALUES (1, 'jin');
특히 AUTO_INCREMENT 키를 사용하는 경우에는 데이터가 연속적으로 쌓이기 때문에 성능이 매우 빠르다. INSERT는 보통 “쓰기 한 번”으로 끝나는 단순한 연산이라고 볼 수 있다.
UPDATE는 이미 존재하는 행을 찾아 값을 바꾸는 연산이다.
먼저 인덱스를 통해 수정할 row를 검색한다. 이후 해당 row를 잠그고, 원본 데이터를 롤백할 수 있도록 undo log에 기록한다. 그런 다음 새로운 값으로 데이터를 갱신하고, redo log와 binlog에 변경 사항을 남긴다. 마지막으로 commit을 실행한다.
UPDATE users SET name = 'jin' WHERE id = 1;
UPDATE는 “찾고 → 잠그고 → 원본 저장 → 수정 반영”이라는 여러 단계를 거치기 때문에 INSERT보다 훨씬 무겁다.
INSERT는 새로운 데이터를 추가하는 단순 연산이므로 가장 빠른 쓰기 작업이다. UPDATE는 데이터를 찾고, 잠그고, 원본까지 기록해야 하기 때문에 상대적으로 비용이 크다.
대량의 데이터를 처리할 때 이 차이가 뚜렷해진다. 수십만 건 이상의 데이터를 INSERT하는 경우는 비교적 빠르게 처리되지만, 같은 규모의 UPDATE는 인덱스 탐색과 잠금이 반복되면서 훨씬 느려질 수 있다.