[DB] MySQL - DDL TRUNCATE과 DELETE

|
MySQL의 DDL중에는 DML의 DELETE 명령어와 비슷한 기능을 하지만 사실은 전혀 다른 TRUNCATE 명령어가 존재한다.

그렇다면 이 두가지 명령어는 어떠한 공통점과 차이점을 가지는지 비교해 보도록 하자.

먼저 공통점에 대해서 살펴보자.

DELETE FROM TEST;

TRUNCATE TABLE TEST; 


이 두 SQL문을 실행하고 해당 테이블의 데이터를 조회할 경우 결과는 같게 나타날 것이다.


DELETE FROM TEST WHERE name='짜짜로니';

TRUNCATE TABLE TEST; 


다음은 이 두 SQL문을 실행해보자. 이번에도 결과가 같은지 살펴보자. 결과는 다르게 나타날 것이다.


DELETE 명령어와 TRUNCATE 명령어의 공통점은 해당 테이블의 데이터를 삭제한다는 것이다. 하지만 두번째 예시를 보면 알 수 있듯이

항상 똑같이 작동하는 것은 아니다. 예시에서와 같이 DELETE 명령어는 뒤에 WHERE절을 통해 조건을 부여할 수 있다.

TRUNCATE은 조건절의 부여없이 테이블의 데이터를 모두 삭제하는 명령어이며, DELETE는 모든 데이터를 삭제하거나 조건절 부여를

통한 일부 데이터를 삭제하는 명령어이다.


우리는 두가지 예시를 통해 두 명령어간의 차이점을 쉽게 확인할 수 있었다. 하지만 두 명령어간의 차이점은 이것만 존재할까.

사실 DELETE와 TRUNCATE의 가장 큰 차이점은 데이터를 삭제하는 방식이다.

DELETE의 경우 데이터를 한줄씩 순차적으로 삭제하고 TRUNCATE은 테이블 DROP 후 CREATE를 수행한다.

이는 두 명령어 간의 목적차이로 발생하는 차이인데, DELETE는 해당 데이터를 삭제하고 삭제한 공간을 재사용하기 위한 명령어이고

TRUNCATE은 테이블 명세만을 남기고 데이터가 존재하던 공간마저 제거하기 위한 명령어이다.

두 명령어 중 속도는 TRUNCATE가 더 빠르지만 복구가 불가능하다는 제한사항 또한 존재한다.


또다른 TRUNCATE의 특징으로는 다음과 같은 것들이 존재한다.

기존에 AUTO_INCREMENT로 지정하여 값이 증가하던 컬럼이 초기화 된다.(5.0.13 버전부터)

[테이블명].frm 파일이 유효할 경우, 데이터나 인덱스가 손상된 경우라도 빈 테이블로 재생성이 가능하다. 


간단하게나마 DELETE와 TRUNCATE의 차이점을 살펴보았다.

위에서 서술한 내용들을 참고하여 DELETE와 TRUNCATE을 때에따라 적절하게 사용토록 하자.

 
And