인덱스 변경 시 DB에 락이 걸릴 수 있습니다, 그리고 DB 종류, 인덱스의 종류, DDL 명령어 종류에 따라 그 양상이 다릅니다. 아래에서 MySQL 기준으로 설명드릴게요 (다른 DB도 비교 가능).
---
✅ 인덱스 변경 시 락 발생 여부 (MySQL 기준)
1. 기본적으로 인덱스 추가/변경은 LOCK이 걸립니다
특히 InnoDB에서 ALTER TABLE로 인덱스 추가/삭제 시,
디폴트는 Table-level lock 발생
ALTER TABLE users ADD INDEX idx_name (name); -- 보통 Table Lock
---
2. ✅ Online DDL을 사용하면 락 없이도 처리 가능
MySQL 5.6 이상부터는 InnoDB에서 일부 DDL 작업에 대해 ONLINE 옵션을 지원
ALTER TABLE users ADD INDEX idx_name (name), ALGORITHM=INPLACE, LOCK=NONE;
옵션 의미
ALGORITHM=INPLACE 테이블 복사 없이 변경
LOCK=NONE 쓰기/읽기 둘 다 가능 (락 없음)
※ 단, 모든 인덱스 작업이 LOCK=NONE을 지원하는 건 아님
---
3. ✅ 락 종류
LOCK 타입 설명
NONE 읽기/쓰기 모두 가능 (이상적)
SHARED 쓰기 불가, 읽기 가능
EXCLUSIVE 읽기/쓰기 모두 불가 (테이블 완전 락)
> SHOW ENGINE INNODB STATUS 또는 performance_schema.metadata_locks 로 확인 가능
---
✅ 예외/주의할 점
큰 테이블에서 인덱스 추가 시 시간이 오래 걸려 락 유지 시간도 길어짐
복제 환경에서는 슬레이브에까지 반영 시 delay 발생 가능
MySQL < 5.6 or MyISAM 은 무조건 테이블 전체 락
---
🔧 실무 팁
대용량 테이블이면 꼭 LOCK=NONE 가능 여부 확인
pt-online-schema-change 같은 툴 사용 시 제로 다운타임 인덱스 변경 가능
변경 전 EXPLAIN으로 쿼리 계획 확인 + SHOW PROCESSLIST로 병목 감지
---
🔍 결론
상황 락 여부
기본 ALTER TABLE ✅ 락 발생 (읽기/쓰기 제한될 수 있음)
InnoDB + ONLINE DDL ⚠️ 일부 작업은 락 없음 (LOCK=NONE)
pt-online-schema-change 사용 ✅ 무중단 가능 (안전하게)
'Spring & Backend' 카테고리의 다른 글
| RDB에서 페이징 쿼리의 필요성을 설명해 주세요 (2) | 2025.07.24 |
|---|---|
| 브라우저가 폰트를 적용하는 과정을 설명해주세요 (4) | 2025.07.24 |
| @Transactional 안먹히는 경우 (4) | 2025.07.24 |
| never와 unknown 타입에 대해서 설명해주세요 (2) | 2025.07.23 |
| 낙관적 락과 비관적 락에 대해 설명해 주세요. (2) | 2025.07.23 |
