예를 들어서, 헬스클럽의 회원 명부를 관리하는 테이블이 있다고 가정합시다. 이 테이블은 보통 다음과 같은 컬럼들로 구성이 될 것입니다.
여기서, 성별이라는 컬럼을 인덱스로 설정하면 어떻게 될까요? 성별은 남성 혹은 여성밖에 없습니다. 회원이 1000명이 된다고 쳐봅시다. 성비율이 5:5라고 가정하면 남성 500명에 여성 500명이겠죠? 뭐… 이럴 수 있습니다. 여기까진 좋아요.
그런데, 헬스클럽 사장님이 이번에 영업이익 극대화를 위해 저명한 요가선생님을 초빙했다고 해보죠. 요가는 보통 여성이 남성보다 훨씬 많이 하니까 헬스클럽 사장님은 여성회원들 대상으로 SMS를 발송하고 싶을 것입니다. 자, 그러면 이제 여성회원 목록만 조회해볼까요? 다음과 같은 쿼리를 쓰면 될 것입니다.
SELECT name, phone_number FROM members WHERE gender = 'F';
오. 사장님은 내심 기대를 합니다. gender라는 컬럼에 인덱스를 설정했으니 검색결과가 엄청 빠르겠다고. 하지만, 실상 모든 회원들을 검색한 결과와 시간차이가 거의 나지 않습니다. 왜일까요?
gender라는 컬럼의 Selectivity (분포도)가 좋지 않기 때문입니다. gender는 ‘M’ 아니면 ‘F”밖에 없을텐데 이것을 데이터베이스의 입장에서 검색을 한다고 쳐봅시다. ‘F’의 값을 가진 레코드는 무려 500건이나 되기 때문에 데이터베이스는 풀스캔과 다를바 없이 테이블의 인덱스가 가리키는 값을 참조하면서 해당하는 레코드들을 갖고 올 것입니다. 이것은 매우 좋지 않은 인덱스 설정입니다.