SQL/MySql
MySQL 테이블 복사 및 이름 변경
daeyun대윤
2024. 1. 17. 10:47
몇 개월 전에 짜놓은 쿼리가 데이터가 얼마 안될 때는 몰랐는데, 조회 갯수가 1억개 정도 넘어가니까 쿼리 속도가 3초가 넘어가는 것을 알게 됐다.
원인을 찾아보니, WHERE 조건에 있는 컬럼중에서 인덱스가 적용 안된게 있었다. 5초간격으로 서버에서 데이터를 받아오는 테이블이라서 어떻게 하나 고민이었다.
인덱스를 추가해야 될거 같은데, mysql 인덱스 추가를 검색해보니 추가라기보다는 인덱스를 지우고 다시 인덱스를 생성해야 되는 식이었다.
대표님한테 여쭤보니 화이트보드에다가 순서대로 하라고 친절하게 알려주셨다.
원본 테이블 복사후에 RSENAME해서 복사테이블과 원본테이블을 바꿔치기 하고, 그 사이에 인덱스를 새로 추가한다.
그리고 다시 RENAME으로 복사한 테이블과 원본 테이블의 이름을 바꿔주고, 인덱스 작업 중에 쌓인 데이터가... 복사한 테이블이 원본 테이블 이름을 갖고 있으니까 복사한 테이블에 쌓였을 테니까..... 그 데이터만 다시 원본 테이블에 넣어주기.
처음에는 복잡하게 느껴졌는데, 한 번 실행하고 나니까 쉽게 느껴졌다. 대표님이 순서까지 알려주신 덕분에.. 개꿀.. 감사합니다!
-- [1] 원본 복사 A 테이블 생성
-- CREATE TABLE `l_dust_a` LIKE `l_dust`;
-- [2] 원본 테이블 -> B
RENAME TABLE `l_dust` TO `l_dust_b`;
-- [3] 원본복사한 테이블 A -> 원본 이름
RENAME TABLE `l_dust_a` TO `l_dust`;
-- [4] 원본 테이블 pk 생성
-- 기존 기본 키를 삭제 후
ALTER TABLE `l_dust_b` DROP PRIMARY KEY;
-- STRG 새로운 기본 키 추가. (제일 앞 순서로)
ALTER TABLE `l_dust_b` ADD PRIMARY KEY (`STRG`,`OCRN`,`ID2`,`ID`);
-- [5]
RENAME TABLE `l_dust` TO `l_dust_a`;
-- [6]
RENAME TABLE `l_dust_b` TO `l_dust`;
728x90
300x250