인덱스 변경 시 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 사용 ✅ 무중단 가능 (안전하게)




LIST

+ Recent posts