본문 바로가기

Programming/Data Structure

Database - index를 걸어놓은 column을 다룰때 주의점 몇가지입니다.


index가 걸려있는 column을 select를 할 경우에는 그 column의 index structure에 들어가서
데이터를 가져오게 됩니다.
그래서 이미 정렬이 되어있는 data들이 select되기 때문에 cost는 매우 적습니다.
(보통 binary tree구조로 되어있으며 DBMS가 data의 CUD에 따라서 새로이 정렬을 합니다.
 사실 binary plus tree 구조라고 하는데, 그 의미를 제가 정확히 이해 못하고 있으며, 또한 큰 차이가 없다하여
 그냥 binary tree라고 이해하고 있는 중입니다. 물론 시간이 허락한다면 수정할 것입니다.)
index를 타기 위해서는
where 조건으로 반드시 index를 탈 수 있도록 사용자가 index가 걸려 있는 column을 명시해주어야합니다.
그렇지 않으면 DBMS는 fullscan 을 하거나,
order by 조건으로 index 걸어놓은 column을 넣어줄 경우에는 (index 걸어놓은 column외에도 마찬가지로)
full scan을 하여 가지고 온 row들을 재정렬하게 됩니다. (시계 똑딱거리는 소리가 들리죠...)

index가 걸려있는 column에 data의 CUD 발생시 순간적으로 부하가 걸리는 경우는 이러합니다.
binary-tree 구조로 되어있는 index가 참조중인 column에 data가 CUD된다면
DBMS의 인공지능에 따라서 최적화를 고려하게 됩니다.
그리고 최적화를 진행함이 결정된다면 DBMS는 실제 사용자가 사용하는 table의 data와는 무관하게
index structure를 rebuilding 하게 됩니다. 이때 quick sort를 사용하는데 발생하는 cost는 nLogn 이 됩니다.


최근에야 알게된 사실로는 index를 여러 column에 줄 수 있다는....것입니다...(참 공부를 안해서 이제서야...ㅠㅠ)

이럴 경우에는 index structure는 column의 순서대로 여러 차원의(??) index structure가 물려집니다.
즉 다시 말하면 
a, b, c라는 column 이 있다고 합시다.
index는 (a, b, c)로 걸려있구요.

a column 의 node 하나에 b column data들이 index structure로 딸려 있습니다. (마땅히 좋은 표현이 생각이 안나네요;;)
그리고 예상하시는 것처럼 b column 의 node 하나에 c column data들이 index structure로 딸려 있습니다.
만약 해당 table에 걸려있는 index가 위처럼 (a, b, c) 만 있다면 해당 테이블에서 select 작업을 할 때
조건에 대해 유념할 부분은 b, c 컬럼에 대한 index는 무의미하다는 것입니다.
a column의 node에 종속적인 관계를 가지게 되는 structure가 형성되는 것이기 때문이죠.
a column의 node에 대한 정보가 없는 한 종속당하고 있는 b, c의 index structure는 무의미합니다.
(뭐,,, 영어권의 외쿡에선 이걸 a node thread 뭐시기 하는 것 같은데.... 적당한 표현이 생각이 안나네요. 
 아시는 분은 comment 부탁드려요~ ) 

그럼 이때, 생각할 수 있는 것으로는 각각의 column에 index를 걸어버리면 가장 빠른 select를 할 수 있겠다고
할 수 있겠죠. 하지만, 이 부분은 위에서 알려드린 것과 마찬가지로 그만큼의 index structure rebuilding 작업이
수반되어집니다. CUD 작업이 발생하는 순간 시계똑딱거리는 소릴 듣게되는 수가 생기는 것이죠.

마지막으로, 개별적인 index들 (a) (b) (c) 처럼 각각의 column들에 대한 index를 거는 것은 어떨까요?
독립적이라는 표현이 알맞게 각각의 index structure를 가지고 있기 때문에 이러한 column들에 대해서는
DBMS는 조건문의 조건에 우선순위를 결정하게 됩니다.
조건이라 함은 = , between, in 등 뭐 여러가지의 연산들을 뜻합니다.



이상... index를 걸어놓은 column을 다룰 때 주의점을 몇가지 작성해보았습니다.
외에 알고 계시는 힌트가 있다면 언제든지 comment 환영입니다. :)


※ 위 기록은 mySQL DBMS를 베이스로 하고 있습니다.