내용 출처
1. [10분 테크톡] 🏫안돌의 INDEX
Index: (검색을 위해) 특정 규칙에 의해 부여된 임의의 대상을 가리키는 키
DB에서 자주 접근하여 사용하는 테이블을 메모리에 올려서 사용할 경우, 사용자의 데이터 요청에 빠르게 대응할 수 있는데 만약 이와 같이 데이터를 메모리에 올려두지 않는다면 Full Table Scan을 수행해야 하며 이는 데이터 용량이 커질수록 효율성이 반비례하여 낮아짐
이와 같은 Full Scan을 막기 위해서 Index를 만들며, Index를 메모리에 저장해 둠
약한 참조 관계
Inex는 B-Tree 자료 구조를 활용하여 Index를 구성한다. B-Tree는 자식 노드가 최대 2개인 이진트리의 변형으로 자식노드가 2개 이상인 Tree를 뜻한다.
B-Tree가 Database에서 운용되는 방식은 수직적 탐색과 수평적 탐색이 동시에 이루어지며, 수직적으로 조건을 만족하는 첫 번째 Record를 찾아 선택하고 Leaf Node에서 수평적으로 조건을 만족하는 Record를 찾는다.
위 상황에서 5번 멤버 번호를 가진 데이터를 찾고자 할 때,
Root Table
에서 team01의 3번 멤버가 가리키는 Child Table인 2로 들어간다.Child Table 2
에서 3과 10으로 분기되는 상황에서 찾고자 하는 목표인 5가 시작되기 전 번호인 3번 번호의 Child Table 10으로 들어간다.Child Table 10
에서 멤버 번호 5를 찾아서 말단 Row 주소를 Disk에서 조회한다.InnoDb Storage Engine은 디스크에 데이터를 저장하는 가장 기본 단위를 페이지 혹은 블록으로 하며, 이는 디스크의 I/O 작업의 최소 단위가 되므로 인덱스 또한 페이지 단위로 관리된다고 이해할 수 있다.
Index를 활용함으로써 효율성을 가장 극대화 시킬 수 있는 상황은 SELECT(조회) 기능을 수행할 때이다. 반면 INSERT, UPDATE, DELETE에서는 INDEX 작업을 하는 것이 오히려 성능을 저하할 수 있는데 이유는 아래와 같다.
INSERT
: 정렬이 된 상태로 INDEX가 저장된 상태에서 INSERT를 함으로써 특정 위치에 데이터를 넣고 기존 데이터를 뒤로 밀어남으로써 작업양이 증대DELETE
: INDEX의 데이터를 실제 지우지 않고, 사용 안함으로 표시하기 때문에 공간 상 낭비가 발생하게 됨UPDATE
: INDEX에는 UPDATE 개념이 없기 때문에 DELETE을 하고 INSERT를 함으로써 성능 저하가 발생Cardinality
Cardinality: the number of elements in a set or group
특정 칼럼에 대해 Index를 했을 때, 그 상대적인 효과성을 평가할 수 있는 지표로서, 동일 칼럼 내에 중복된 항목(데이터)이 많을 수록 카디널리티가 낮아지고, 고유한 값일 수록 카디널리티가 높아진다.
성별
과주민번호
중 어디에 인덱스를 걸어야 할까?
- 결론적으로
성별
에 비해주민번호
가 Cardinality가 더 높으며, 주민번호에 인덱스를 거는 것이 더욱 효율적이다.이름
= 펭수,성별
= 남성,나이
= 10살,주민번호
= 100808-3111111 데이터를 찾는다고 할 때,주민번호
를 기준으로 찾는 것이 가장 효율적이고 정확하게 원하는 값을 식별할 수 있음
Cardinality를 가장 직관적으로 이해하는 방법 중 하나는 해당 칼럼의 값을 전부 뽑아 set()
메서드에 넣어 고유한 값만 남긴다고 생각해보면 쉽다. 1,000개의 유저 정보가 담긴 테이블에서 성별
칼럼의 데이터를 전부 뽑아서 set()
에 넣는다면 (특수한 경우가 아니라면) 남성
, 여성
두가지 항목만 남는다. 하지만 주민번호
칼럼의 경우 같은 과정을 거쳤을 때 1,000개의 항목이 그대로 남게 될 것이다. 따라서 주민번호 set에 담긴 개별 요소의 수 (the number of elements in a set or group)가 더 많다고 이해하면 되는 것이다.
따라서, 어떤 컬럼에 대해 인덱스를 걸지 결정할 때, 해당 컬럼에 인덱스를 걸었을 때 얼마나 손쉽게 개별 데이터 식별이 가능한지를 고려해야하며, 이 때 활용할 수 있는 개념이 Cardinality인 것이다.