Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 테이블 TRUNCATE 후 인덱스를 다시 생성해야 할까요?

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은 테이블을 삭제한 뒤 재생성하는 방식으로 동작하기 때문에 기존 인덱스가 자동으로 복원되며, 별도로 인덱스를 다시 추가할 필요가 전혀 없습니다.