안녕하세요?
현재 회사에서 사용중엔 DB Table 중 구매 테이블의 데이터 건수가 3억건이 넘어가고 있는데, 제대로 인덱스가 잡혀있지 않아 해당 작업을 진행하려고 합니다.
기존 Table과 구조가 똑같은 Table을 만들어서 추가하고자 하는 인덱스를 추가한 뒤에
INSERT INTO ~~ SELECT * FROM ~~
형식으로 복사해서 넣고 그 이후
ALTER TABLE RENAME 으로 이름을 변경하려고 합니다.
위와 같이 진행하려고 몇가지 테스트를 해본 결과 제가 잘 모르는 문제가 생길 수 있을것 같아 여기 계신 여러 분들의 고견을 듣고 싶습니다.
1. 복사하려는 Table이 구매 정보가 저장되는 Table이다 보니 복사하는 과정에서 Insert 나 Update 가 꾸준히 발생하고 있습니다.
만약 INSERT INTO A SELECT * FROM B WHERE no > 10000 AND no < 100000
처럼 최대 크기가 아닌 훨씬 멀리 떨어진 영역에서 SELECT를 하더라도 B Table에 INSERT 를 하기 위해서 SELECT 가 끝날때까지 대기하나요?
innoDB 는 insert 와 select, update가 각각 row 단위로 lock 이 걸린다고 알고 있는데 테스트를 해봤을때는 SELECT 가 종료되기 전까지 INSERT 가 안되는것 같아서 문의 드립니다.
2. 현재 DB가 Master - Slave 구조로 Slave 가 15개 연결이 되어 있는 상태입니다.
데이터 양이 많다 보니 서비스중에도 꾸준히 데이터를 복사하다가 어느순간 교체를 하려고 하는데,
ALTER TABLE RENAME 을 사용할때 Table의 용량이 크면 속도가 그만큼 오래 걸리는지요?
어디서 봤을때는 메타 정보만 변경하는것이기 때문에 RENAME 은 용량등에는 영향을 받지 않는다고 본거 같은데, 다시 찾아보려니 그런 말을 찾을 수가 없어서 문의드립니다.
ALTER TABLE 로 필드 추가나 INDEX 등을 추가할때는 tmp TABLE을 만들어 처리하는걸로 알고 있는데 RENAME 도 이와같이 처리가 되는건지 궁금하네요.
혹 제가 방식을 잘못 생각하고 있다면 다른 분들은 어떤 방식으로 대용량 Table에 Index 를 추가하는지 조언을 해주시면 감사하겠습니다. |