개발일지/SQL

[Oracle] 인덱스(Index)의 정의

연습용365 2021. 11. 21. 13:26

 인덱스(INDEX) 

 

  • 테이블의 데이터를 좀 더 빨리 찾을 수 있다. (항상 그런 건 아님)
  • 인덱스를 생성하게 되면 INDEX TABLE을 생성해 관리하게 된다.
  • 테이블에 있는 칼럼 중 하나 이상의 컬럼으로 생성을 한다.
  • 데이터베이스 공간을 차지해서 추가적인 공간이 필요해진다. (데이터베이스 10% 정도 추가 공간 필요)
  • 처음 인덱스 생성시 시간이 많이 소요
  • 데이터의 변경 작업이 자주 일어날 경우 오히려 성능이 나빠진다.

 

우리가 테이블을 생성할 때 오브젝트를 생성한다고 한다. 인덱스의 경우도 오브젝트의 한 종류이고 인덱스가 생성되면 테이블과 매핑(서로 다른 테이블 간의 연결되는 프로세스)되는 또 다른 테이블이 하나 더 생성되는 것이다. 

 

 


Q. 테이블이 하나 더 생성이 됐는데 어떻게 속도가 빨라지는 걸까?

 

인덱스를 알기 전 일반 테이블의 작동 원리에 대해서 알면 좋다. 일반 테이블을 만들 땐 순서대로 저장되는 것이 아닌 마구잡이로 저장이 된다. 그 안에서 어떤 특정 조건의 데이터를 찾으려면 테이블을 풀스캔(전부 훑기) 해야해서 테이블 양이 방대할 경우 속도가 느려진다. 그런데 인덱스의 경우 인덱스 컬럼을 기준으로 소팅(정렬)이 되어서 저장 된다. 때문에 특정 조건의 데이터 검색을 할 때 시작점을 지정해서 그곳부터 스캔을 할 수 있으니까 속도가 빠르다. 인덱스와 테이블이 서로 매핑되어 있으니까 인덱스에서 우선 데이터를 거른 다음에 일반 테이블 중 매핑되어 있는 곳으로 가서 나머지 데이터들을 찾기 때문에 풀스캔과 비교해서 속도가 현저히 짧아지는 것이다. 

인덱스는 해당 테이블 방의 주소를 갖고 있다. 방 한 칸 데이터가 저장 되는 최소 단위이고 여기엔 테이블의 데이터들이 로우 단위로 저장이 되어 있다. 만약 칼럼수가 많을 때는 하나의 방 안에 로우의 수가 적게 저장될 수 밖에 없고, 반대로 컬럼수가 적다면 방 안에 저장되는 로우의 수가 많아지게 된다. 

 

 

Q.효율적인 인덱스를 만들기 위해 어떤 절에서 사용하는 것이 좋을까? 

 

  • WHERE절 : 특정 조건을 이용해서 데이터를 찾아야 하니까 자주 등장하는 컬럼을 설정한다.
  • ORDER BY절 : 자주 등장하는 컬럼을 인덱스로 지정해 놓으면 소팅이 되어서 저장되기 때문에 따로 ORDER BY를 수행할 필요 없이 인덱스에서 바로 꺼내 사용할 수 있다. 
  • SELECT : 단일 컬럼으로 구성 가능하지만 여러 컬럼들도 조합해서 결합 인덱스로도 사용 가능하다. 그 경우 SELECT에 등장하는 컬럼들을 잘 조합해서 사용하면 별도의 테이블에서 데이터를 꺼낼 필요 없이 인덱스 스캔만 해서 바로 출력하니까 빠르게 사용 가능하다.

 

★ 우 아 ! 인덱스가 빠르고 효율적이니까 남용해야겠다~~!

아무리 좋아도 인덱스도 오브젝트이기 때문에 SELECT로 찾을 땐 빠를지 몰라도 INSERT/UPDATE 속도는 오히려 느리다. 특히 인덱스는 정렬이 되어서 저장되어야하기 때문에 어느자리에 INSERT를 할 건지 찾아서 일일이 저장을 해야한다. 때문에 저장과 수정은 속도가 느릴 수 밖에 없다. 테이블 뿐만 아니라 인덱스에도 같은 과정을 반복해줘야 하기 때문에 오히려 두 배로 손이 많이 가고 오래 걸린다. 

 

그 밖에도 . . . 

결합인덱스의 경우 결합하는 칼럼의 순서가 중요하다. 예를들어 성별 보다는 아이디 같이 거르기 쉬운 것이 바로 인덱스 스캔해서 찾을 수 있기 때문이다. 인덱스를 사용한다고 해서 무조건 속도가 빨라지는 건 아니다. 전체 테이블의 10~15% 사이의 데이터가 출력이 될 때만 인덱스를 타는 게 효율적이고, 오히려 이 이상이 될 때는 풀스캔 하는 게 더 빠르다.