Table의 column중에서 Cardinality가 높은 값을 우선순위로 Index를 설정할 수 있습니다.
사람의 주민등록번호, 성별, 이름을 기준으로 Cardinality순위는 주민등록번호 > 성별 > 이름입니다.
복합키에도 Cardinality 순서로 키를 만드는 것이 좋습니다.
Cardinaltiy수치는 MySQL기준으로 SHOW INDEX FROM TABLENAME
으로 확인할 수 있습니다.
B+-Tree
자료구조를 사용하는 Index Key의 경우 Records Insert, Update, Delete Operation에서 추가적인 연산이 들어가며 너무 많은 Index Key를 설정하는 경우 추가, 수정쿼리에서 성능이 낮아질 수 있습니다.
시나리오
아이폰은 1만개가 있고 기종이 SE2
면서 용량이 64GB
인 아이폰을 찾자
경우 1 기종의 Cardinality
수치가 10
경우 2 기종의 Cardinality
수치가 1000
경우 1은 Cardinality가 10입니다.
1만개의 아이폰에서 종류가 10가지만 존재합니다.
이말은 어떤 기종을 찾는다 해도 무조건 10000/10
개의 개수가 나왔으며 발견된 1000개의 아이폰에서 64GB
용량을 가진 것을 찾아야 합니다.
만약 64GB
가 1개가 나왔다면 나머지 999개를 버려야 합니다.
경우2는 Cardinality가 1000입니다.
1만개의 아이폰에서 종류가 1000가지가 존재합니다.
그러면 어떤 기종을 찾는다 해도 10000/1000
개의 개수가 나오며 발견된 10개의 아이폰에서 64GB
용량을 가진 것을 찾아야 하는데
1개가 나왔다면 9개만 버려도 되는 것 입니다.
https://en.wikipedia.org/wiki/Cardinality_(SQL_statements)
https://orangematter.solarwinds.com/2020/01/05/what-is-cardinality-in-a-database/
https://logicalread.com/mysql-index-cardinality-mc12/#.ZEcUDOxBxhE
https://severalnines.com/blog/understanding-indexes-mysql-part-three/