테이블에서 검색 성능을 높이기 위한 보조 자료구조
MS SQL에서는 삽입 시 pk를 기준으로 정렬된 형태로 삽입, pk로 검색 시 이진탐색으로 데이터를 찾음
→ 그럼 pk가 아닌 데이터로 검색하려면? RID를 이용한 인덱스로 탐색
파일 자체가 인덱스인 경우, 파일을 조직할 때 레코드의 순서를 파일에 대한 인덱스의 순서와 동일한 순서로 유지(인덱스의 순서 == 실제 데이터의 순서)
인덱스를 생성하고 쿼리문을 실행시켜도 쿼리 옵티마이저 판단에 더 효율적인 방식으로 탐색한다.
// CategoryNo를 기준으로 하는 Index(idx_product_categoryNo) 생성
SELECT *
FROM Product
WHERE CategoryNo > 0

내가 원하는 플랜으로 실행하려면 인덱스를 명시해줘야한다.
SELECT *
FROM Product
WITH (INDEX(idx_product_categoryNo))
WHERE CategoryNo > 0

인덱스는 테이블의 검색 성능을 향상시키기 위한 보조 자료구조로써 성능 향상에 큰 도움이 된다.
하지만 모든 데이터에 대해서 빠른 성능을 내기 위해 인덱스를 생성하는 것은 바람직하지 않다. 인덱스를 사용하는 데는 몇 가지 단점도 함께 존재하는데, 이를 제대로 이해하고 관리하지 않으면 성능이 오히려 악화될 수 있다.
1. 쓰기 성능 저하 (삽입, 수정, 삭제)
인덱스는 읽기 성능을 빠르게 해주는 대신, 데이터를 삽입하거나 수정, 삭제할 때는 성능을 저하시킬 수 있다.
2. 디스크 공간 추가 소모
인덱스는 별도의 데이터 구조로 저장되기 때문에 추가적인 디스크 공간이 필요하다.
3. 인덱스 관리 오버헤드
인덱스는 시간이 지나면서 비효율적으로 변할 수 있다.
4. 복잡한 쿼리에서 인덱스가 비효율적일 수 있음
모든 쿼리가 인덱스를 잘 활용하지는 않는다.
5. 중복 인덱스 문제
인덱스는 적절하게 설계되지 않으면 오히려 성능을 저하시키기도 한다.
6. 인덱스가 항상 성능을 향상시키는 것은 아님
작은 테이블에서는 인덱스가 오히려 비효율적일 수 있다.
결론
인덱스는 검색 성능을 높이는 강력한 도구지만, 그만큼 쓰기 성능 저하, 디스크 공간 소모, 관리 오버헤드와 같은 단점도 있다. 특히, 인덱스를 너무 많이 만들거나 부적절하게 사용할 경우, 성능이 오히려 악화될 수 있다. 따라서 데이터베이스를 설계할 때는 인덱스 사용의 이점과 단점을 충분히 고려하여 적절한 인덱스 전략을 수립하는 것이 중요하다.