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

MySQL TRUNCATE와 DELETE의 차이점: AUTO_INCREMENT 초기화부터 성능까지

MySQL에서 TRUNCATE는 테이블 구조를 데이터베이스에 그대로 남겨둔 채 모든 행(row)을 제거하는 명령입니다. DELETE 명령 역시 테이블의 모든 행을 삭제할 수 있기 때문에 겉보기에는 같은 작업을 하는 것처럼 보입니다. 하지만 두 명령 사이에는 PRIMARY KEY AUTO_INCREMENT 값의 재초기화 여부라는 중요한 차이점이 존재합니다.

컬럼이 PRIMARY KEY 제약 조건과 함께 AUTO_INCREMENT로 정의되어 있다면, DELETE 명령으로 모든 행을 삭제하더라도 테이블은 재초기화되지 않습니다. 즉, 이후 새로운 행을 삽입하면 AUTO_INCREMENT 번호는 마지막으로 삽입된 행의 다음 번호부터 이어집니다. 반면 TRUNCATE를 사용하면 테이블이 마치 새로 생성된 것처럼 완전히 초기화되므로, 실행 후 새 행을 삽입하면 AUTO_INCREMENT 번호가 1부터 다시 시작됩니다.

예제로 확인하기

다음 예제를 통해 두 명령의 차이를 단계별로 살펴보겠습니다.

1단계: 테이블 생성 및 데이터 삽입

mysql> CREATE TABLE testing(Id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, Name VARCHAR(20));
Query OK, 0 rows affected (0.15 sec)

mysql> INSERT INTO testing(Name) VALUES('Gaurav'),('Rahul'),('Aarav'),('Yashraj'),('Manak');
Query OK, 5 rows affected (0.09 sec)
Records: 5 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM testing;
+----+---------+
| Id | Name    |
+----+---------+
|  1 | Gaurav  |
|  2 | Rahul   |
|  3 | Aarav   |
|  4 | Yashraj |
|  5 | Manak   |
+----+---------+
5 rows in set (0.00 sec)

2단계: DELETE로 행 삭제 후 새 행 삽입

mysql> DELETE FROM testing WHERE id >= 4;
Query OK, 2 rows affected (0.04 sec)

mysql> INSERT INTO testing(Name) VALUES('Harshit'),('Lovkesh');
Query OK, 2 rows affected (0.06 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM testing;
+----+---------+
| Id | Name    |
+----+---------+
|  1 | Gaurav  |
|  2 | Rahul   |
|  3 | Aarav   |
|  6 | Harshit |
|  7 | Lovkesh |
+----+---------+
5 rows in set (0.00 sec)

DELETE로 id 4, 5번 행을 삭제한 뒤 새 행을 삽입하자, AUTO_INCREMENT 값이 1부터 시작하지 않고 기존 시퀀스를 이어받아 6, 7부터 할당된 것을 확인할 수 있습니다.

3단계: TRUNCATE 실행 후 새 행 삽입

mysql> TRUNCATE TABLE testing;
Query OK, 0 rows affected (0.10 sec)

mysql> INSERT INTO testing(Name) VALUES('Harshit'),('Lovkesh'),('Ram'),('Gaurav');
Query OK, 4 rows affected (0.11 sec)
Records: 4 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM testing;
+----+---------+
| Id | Name    |
+----+---------+
|  1 | Harshit |
|  2 | Lovkesh |
|  3 | Ram     |
|  4 | Gaurav  |
+----+---------+
4 rows in set (0.00 sec)

반면 TRUNCATE 실행 후에는 테이블이 완전히 초기화되어, 새로 삽입된 행들의 AUTO_INCREMENT 값이 1부터 다시 매겨지는 것을 볼 수 있습니다.

TRUNCATE와 DELETE의 주요 차이점 정리

  • AUTO_INCREMENT 초기화: DELETE는 카운터 값을 유지하고, TRUNCATE는 1부터 다시 시작합니다.
  • 조건부 삭제: DELETE는 WHERE 절로 특정 행만 삭제할 수 있지만, TRUNCATE는 항상 전체 행을 삭제합니다.
  • 실행 속도: TRUNCATE는 테이블을 통째로 재구성하는 방식이라 DELETE보다 훨씬 빠릅니다.
  • 트리거 동작: DELETE는 삭제 트리거를 활성화하지만, TRUNCATE는 트리거를 호출하지 않습니다.
  • 트랜잭션: DELETE는 롤백이 가능하지만, TRUNCATE는 DDL에 해당하여 MySQL에서 암묵적으로 커밋되므로 롤백할 수 없습니다.