MySQL에서 TRUNCATE TABLE 명령으로 테이블을 비우면 인덱스를 다시 생성할 필요가 없습니다. 테이블을 잘라내기(truncate)하면 테이블이 내부적으로 삭제 후 재생성되는 방식으로 동작하기 때문에, 기존에 정의된 인덱스가 자동으로 함께 복원됩니다.
아래 예제를 통해 실제로 인덱스가 유지되는지 단계별로 확인해 보겠습니다.
1. 테스트용 테이블 생성
먼저 예제로 사용할 테이블을 만듭니다.
mysql> create table DemoTable
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> FirstName varchar(20),
-> LastName varchar(20)
-> );
Query OK, 0 rows affected (0.65 sec)
2. 인덱스 생성
다음 쿼리로 FirstName과 LastName 컬럼에 복합 인덱스를 생성합니다.
mysql> create index Index_firstName_LastName on DemoTable(FirstName,LastName);
Query OK, 0 rows affected (1.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
3. 데이터 삽입 및 조회
insert 명령으로 레코드를 추가합니다.
mysql> insert into DemoTable(FirstName,LastName) values('John','Smith');
Query OK, 1 row affected (0.47 sec)select 문으로 저장된 데이터를 확인합니다.
mysql> select *from DemoTable;
출력 결과
+----+-----------+----------+
| Id | FirstName | LastName |
+----+-----------+----------+
| 1 | John | Smith |
+----+-----------+----------+
1 row in set (0.00 sec)
4. TRUNCATE 전 테이블 구조 확인
테이블을 비우기 전에 SHOW CREATE TABLE 명령으로 현재 테이블 구조와 인덱스 정보를 미리 확인해 둡니다.
mysql> show create table DemoTable;
출력 결과
+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table
|
+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| DemoTable | CREATE TABLE `DemoTable` (`Id` int(11) NOT NULL AUTO_INCREMENT,`FirstName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,`LastName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,PRIMARY KEY (`Id`),KEY `Index_firstName_LastName` (`FirstName`,`LastName`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
출력 결과에서 PRIMARY KEY와 함께 Index_firstName_LastName 인덱스가 정의되어 있는 것을 확인할 수 있습니다.
5. 테이블 TRUNCATE 실행
이제 TRUNCATE TABLE 명령으로 테이블의 모든 데이터를 삭제합니다.
mysql> truncate table DemoTable;
Query OK, 0 rows affected (2.01 sec)
6. TRUNCATE 후 테이블 구조 재확인
테이블을 비운 후 다시 한번 구조를 확인해 보겠습니다. 인덱스를 별도로 추가할 필요가 없습니다.
mysql> show create table DemoTable;
출력 결과
+--------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table
|
+--------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| DemoTable | CREATE TABLE `DemoTable` (`Id` int(11) NOT NULL AUTO_INCREMENT,`FirstName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,`LastName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`Id`),KEY `Index_firstName_LastName` (`FirstName`,`LastName`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
+--------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
결론
TRUNCATE 이후에도 Index_firstName_LastName 인덱스가 그대로 유지되는 것을 확인할 수 있습니다. 즉, TRUNCATE TABLE은 테이블을 삭제한 뒤 재생성하는 방식으로 동작하기 때문에 기존 인덱스가 자동으로 복원되며, 별도로 인덱스를 다시 추가할 필요가 전혀 없습니다.