HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🍗
[New] 조규현팀
/
🏪
TS Store
/
⚡
Index
⚡

Index

Person
완료율%
상태
완료
나의 블로그
Think Sharing (TS)
🗂️
Index
주제목차내용인덱스(INDEX)란?Index의 종류인덱스 설정/사용 시 고려 사항

주제

 

목차

주제목차내용인덱스(INDEX)란?Index의 종류인덱스 설정/사용 시 고려 사항

내용

 
 

인덱스(INDEX)란?

사전의 색인과 똑같이 원하는 데이터의 위치를 빠르게 찾아주는 역할을하는 DB 자료구조입니다.
notion image
 
인덱스가 잘 설정되었을 경우 조회 성능을 크게 높일 수 있습니다. 하지만 인덱스를 설정했더라도 인덱스의 효과를 받지 못할 경우도있습니다.
 

Index의 종류

  • Clustered Index(클러스터 인덱스)
    • 테이블 당 한개만 생성이 가능
    • 기본키를 생성하면 자동으로 클러스터 인덱스를 생성
    • 물리적으로 행을 재배열
    • 데이터 입력, 수정, 삭제 시 항상 정렬상태를 유지
    • 넌 클러스터 인덱스보다 검색 속도는 빠르다. 입력,수정, 삭제는 느리다.
    • 30% 이내에서 사용해야 좋은 선택도를 가진다.
    •  
      [10분 테코톡] 👨‍🏫안돌의 INDEX
      💡 우아한테크코스의 크루들이 진행하는 10분 테코톡입니다. 💡 안돌이 데이터베이스의 Index에 대해 공유해주었는데요. 프로그래밍 공부를 본격적으로 시작하기 전, 데이터를 다룰일이 생겨 학습했던 경험이 빛을 발한 발표였습니다. 짧은 시간의 준비로는 나누기 어려운 부분을 쉽게 공유해줘서 모두 놀란 시간이었습니다 :) 🌕우아한테크코스란 🌕 우아한테크코스는 일반 사용자용 서비스를 개발하는 회사가 필요로 하는 역량을 가진 프로그래머를 양성하기 위한 교육입니다.
      [10분 테코톡] 👨‍🏫안돌의 INDEX
      https://www.youtube.com/watch?v=NkZ6r6z2pBg
      [10분 테코톡] 👨‍🏫안돌의 INDEX
      10분 테코톡을 보다보니 이런 사실을 알게 되었습니다.
      요즈음 이메일을 로그인할 때 사용하다 보니 이메일을 유저 테이블의 PK로 사용할 수 있겠지만 이메일을 PK로 지정하는 경우 클러스터드 인덱스가 생성되고, 새로운 계정이 생성될 때 사전순으로 어디에 들어갈지 모릅니다. 그러므로 계정이 생성될 때마다 인덱스 재배열이 일어나게 됩니다.
      PK가 Auto Increment 같은 시퀀셜한 Key일 경우에는 인덱스의 재배열이 일어나지 않아도 되므로 email을 PK로 지정하기보다는 유니크 key로 두고 별도의 시퀀스를 PK로 가져가는 것이 좋습니다.
       
  • NonClustered Index(넌 클러스터 인덱스)
    • 테이블당 약 240개의 인덱스를 만들 수 있다.
    • 유니크 제약조건으로 컬럼을 생성하면 자동 생성
    • 인덱스 페이지는 로그파일에 저장된다.
    • 레코드의 원본은 정렬되지 않고 인덱스 페이지만 정렬된다.
    • 인덱스 자체의 리프 페이지는 데이터가 아니라 데이터가 위치하는 포인터이기 때문에 클러스터형 보다 검색속도는 더 느리지만 입력, 수정, 삭제는 더 빠르다.
    • 별도의 인덱스 페이지를 따로 만들기 때문에 용량을 더 차지한다.
    • 3% 이내에서 사용해야 좋은 선택도를 가진다.
 

인덱스 설정/사용 시 고려 사항

 
  • 인덱스는 별도의 저장공간이 필요합니다.
    • 데이터의 양과 인덱스 생성에 필요한 저장공간은 비례하므로 무작정 많이 설정한다고해서 좋기만한 것은 아닙니다.
 
  • 인덱스는 입력,수정, 삭제가 발생하면 갱신됩니다.
    • 그러므로 인덱스는 최대한 입력, 수정, 삭제가 발생하지 않고, 조회가 잦은 테이블에 적용해야합니다.
 
  • 인덱스는 조회 성능을 향상 시키기 위해 사용됩니다.
    • 그러므로 조건절(WHERE, JOIN ON)에 인덱스가 포함된 컬럼이 들어가야 효과를 볼 수 있습니다.
      또한 조건절(WHERE, JOIN ON)에 많이 사용될수록 인덱스의 효과가 극대화 될 것입니다.
 
  • 인덱스는 중복이 적은 컬럼에 적용하는 것이 유리합니다.
    • 컬럼의 값에 따라 인덱스가 지정되고, 인덱스를 통해 특정 컬럼 값을 찾습니다.
      그러므로 중복이 많을수록 인덱스로 하나의 데이터를 특정하기 어렵습니다.
카디널리티, 선택도를 통해서 얼마나 데이터들이 중복되는지 알 수 있습니다.
  • 카디널리티 : 특정 데이터 집합의 유니크한 값의 개수, 높을 수록 중복도가 낮다.
    • notion image
      위와 같은 테이블에서 레코드의 총 개수는 6개
      age컬럼의 카디널리티는 김형욱과 박진형이 중복되므로 5입니다. 만약 중복이 더 많이 일어난다면 카디널리티가 낮아질 것 입니다.
 
  • 선택도 : 데이터 집합에서 특정 값을 얼마나 잘 골라낼 수 있는지에 대한 지표
    • Selectivity = Cardinality / Total Number Of Records
      즉 위 테이블의 선택도는 5/6 = 83.3% 입니다. 만약 중복이 더 많이 일어난다면 선택도는 점점 낮아질 것 입니다.
선택도가 높을 수록, 카디널리티가 높을수록 인덱스 설정에 좋은 컬럼입니다.
 
 

인덱스 생성법

CREATE INDEX INDEX_NAME ON TableName(ColumnName)