저장(Stored) 생성 컬럼이란?
MySQL의 생성 컬럼(Generated Column)은 다른 컬럼의 값을 기반으로 수식이나 함수를 통해 자동으로 값이 계산되는 특수한 컬럼입니다. 생성 컬럼은 크게 두 가지 방식으로 동작하는데, 그중 STORED 키워드를 사용해 정의하면 저장 생성 컬럼(Stored Generated Column)이 됩니다.
저장 생성 컬럼은 데이터가 INSERT 또는 UPDATE될 때마다 계산된 결과가 실제 디스크에 물리적으로 저장됩니다. 이 덕분에 조회 시 매번 연산을 수행하지 않아도 되므로 읽기 성능이 중요한 환경에서 유용합니다.
예제: triangle_stored 테이블 생성하기
다음 예제는 'triangle_stored'라는 테이블에 저장 생성 컬럼을 만드는 과정을 보여줍니다. SideC 컬럼은 SideA와 SideB 값을 이용해 제곱근(SQRT) 수식으로 자동 계산되도록 STORED 옵션과 함께 정의되었습니다.
mysql> Create table triangle_stored(SideA DOUBLE, SideB DOUBLE, SideC DOUBLE AS (SQRT(SideA * SideB + SideB * SideB)) STORED); Query OK, 0 rows affected (0.47 sec)
테이블 구조 확인
DESCRIBE 명령으로 테이블 구조를 살펴보면, SideC 컬럼의 Extra 항목에 'STORED GENERATED'라고 표시된 것을 확인할 수 있습니다. 이는 해당 컬럼이 저장 방식의 생성 컬럼임을 의미합니다.
mysql> Describe triangle_stored; +-------+--------+------+-----+---------+------------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------+------+-----+---------+------------------+ | SideA | double | YES | | NULL | | | SideB | double | YES | | NULL | | | SideC | double | YES | | NULL | STORED GENERATED | +-------+--------+------+-----+---------+------------------+ 3 rows in set (0.00 sec)
데이터 삽입 후 자동 계산 결과 확인
이제 SideA와 SideB 값만 직접 삽입해 보겠습니다. SideC에는 값을 넣지 않았지만, 테이블에 정의된 수식에 따라 값이 자동으로 계산되어 저장되는 것을 확인할 수 있습니다.
mysql> INSERT INTO triangle_stored(SideA, SideB) Values(1,1),(3,4),(6,8); Query OK, 3 rows affected (0.09 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> Select * from triangle_stored; +-------+-------+--------------------+ | SideA | SideB | SideC | +-------+-------+--------------------+ | 1 | 1 | 1.4142135623730951 | | 3 | 4 | 5.291502622129181 | | 6 | 8 | 10.583005244258363 | +-------+-------+--------------------+ 3 rows in set (0.00 sec)
정리
위 예제에서 볼 수 있듯이, 저장 생성 컬럼을 사용하면 다음과 같은 장점이 있습니다.
- 자동 계산: 애플리케이션 코드에서 일일이 값을 계산해 넣을 필요 없이, MySQL이 수학 표현식을 기반으로 값을 자동으로 산출합니다.
- 물리적 저장: 계산 결과가 실제로 저장되므로 반복적인 조회 시 연산 부담이 없어 성능상 유리합니다.
- 데이터 일관성: 수식이 테이블 정의에 포함되므로, 어떤 경로로 데이터가 입력되더라도 항상 동일한 규칙으로 값이 유지됩니다.
참고로 VIRTUAL 방식의 생성 컬럼은 값을 저장하지 않고 읽을 때마다 실시간으로 계산하는 반면, STORED 방식은 쓰기 시점에 계산하여 저장한다는 차이가 있습니다. 따라서 읽기가 많고 쓰기가 적은 워크로드라면 저장 생성 컬럼이 더 적합한 선택입니다.