MoreLean

MySQL SET type에 대하여 본문

Programmer/Mysql

MySQL SET type에 대하여

judeKim' 2017. 7. 23. 02:03
반응형

MySQL의 SET type에 대해선 문서를 찾아보면 상당히 짧은 것을 확인할 수 있습니다. 


통상적으로 적을 것이 별로 없다는 것은 그만큼 명확하고 단순하거나 아니면 그 특징이 크게 자랑할게 없다고 할 수 있습니다. 


MySQL의 SET type은 후자에 해당한다고 생각합니다. 


SET type을 처음 봤을땐 '이런 데이터 타입이 있군!' 했었는데, DB에서 컬럼 타입을 선택할때 가장 중요한 부분이 성능과 효율성이라고 생각하는데 이 관점에서 SET type의 제한적인 인덱스는 기능에 치명적이었습니다.


먼저 간단히 SET type에 대해서 설명을 하자면, 1개 이상의 값을 저장할수 있는 type입니다. 


이를 테면, 국적이라던지 수강과목이라는 컬럼을 생성할때 이 SET 타입을 쓸 수가 있습니다. 


국적이야 데이터 분포로 봤을때 이중국적의 사람이 워낙 극소수이지만, 수강과목은 기본적으로 다수개를 선택하므로 용이하게 쓰일 수 있을 것 같았으나, 


여기서 SET type의 제한 사항 때문에 국적의 용도로는 쓰기가 어렵습니다. 


오늘(2017-07-23)을 기준으로 전세계 국가의 수는 약 229개로 SET type은 최대 64개의 제약 사항을 가지고 있어 국가의 데이터 타입에는 적합하지 않습니다. 


물론 수강과목도 학교 전체의 과목을 표현하는 용도로 사용한다면 사용 불가능하나 여기에는 치명적인(?) 인덱스 문제가 있습니다. 


예를 들자면 다음과 같습니다. 


korean, english, mathematics.. 이렇게 3과목이 있다면, 


kroean 이나 english 등 단일 데이터를 선택한 데이터도 있지만, korean, english나 korean, english, mathematics 이렇게 3개의 과목을 모두 선택한 경우도 발생을 합니다. 


여기서 korean을 선택한 유저를 질의 하기 위해선 다음과 같이 질의를 해야 합니다. 


SELECT * FROM students WHERE FIND_IN_SET('korea', courses);



MySQL을 써본 분들은 아시겠지만, WHERE 조건에 좌측 비교군이 컬럼이 함수등으로 조합된 경우라면 인덱스을 일반적으로 타지 않습니다. 


하지만 이 구분은 인덱스를 탑니다만, 그다지 효율적인 인덱스 사용은 아닙니다. 


explain 해보면 다음와 같이 나오는 것을 확인할 수 있습니다. 

1 SIMPLE mysql_set_test index NULL cources 1 NULL 3 Using where; Using index


따라서 빈번하게 사용하는 질의의 조건으로 사용하는 컬럼이라면 정규화를 통해 별도의 relation 테이블로 구성하는것이 좋습니다. 







반응형