본문 바로가기

CS 백엔드

[DB 이론] Index (with. Django)

Index

: MySQL과 Django의 기준으로 하였다.


 

1. Index

Index 란..?

RDBMS에서 검색 속도를 높이기 위해서 사용되는 기술이다.
index는 table의 동작속도(조회)를 높여주는 자료구조이며, 데이터의 위치를 빠르게 찾아주는 역할이다.

Table의 컬럼을 따로 파일로 저장해서 검색시 해당 Table의 레코드를 full scan하는 것이 아니라, 저장한 Index 파일을 검색해서 검색 속도를 향상시킨다.  

단점..

조회속도는 빨라지지만 UPDATE, INSERT, DELETE의 속도는 저하된다는 단점이 있다.

 

 

2. Index 생성 및 삭제

1) 인덱스 생성

# 단일 인덱스
CREATE INDEX 인덱스이름 ON 테이블이름(필드이름1)

# 다중 컬럼 인덱스
CREATE INDEX 인덱스이름 ON 테이블이름(필드이름1, 필드이름2, ...)

 

2) 인덱스 조회

SHOW INDEX FROM 테이블이름

 

3) UNUQUE 인덱스 생성 (중복 값을 허용하지 않는 인덱스)

# 단일 인덱스
CREATE UNIQUE INDEX 인덱스 이름 ON 테이블이름(필드이름1)
# 다중 컬럼 인덱스
CREATE UNIQUE INDEX 인덱스 이름 ON 테이블이름(필드이름1, 필드이름2, ...)

 

4) 인덱스 삭제

ALTER TABLE 테이블이름 DROP INDEX 인덱스이름;

 

 

3. 단일인덱스와 다중 컬럼 인덱스의 차이점

Table1 (단일 인덱스)
CREATE TABLE table1(
    uid INT(11) NOT NULL auto_increment,
    id VARCHAR(20) NOT NULL,
    name VARCHAR(50) NOT NULL,
    address VARCHAR(100) NOT NULL,
    PRIMARY KEY('uid'),
    key idx_name(name),
    key idx_address(address)
)​

name, address 컬럼이 INDEX가 걸려있기 때문에, MySQL은 name과 address 컬럼을 보고 둘 중에 어떤 컬럼의 수가 더 빠르게 검색되는지 판단 후 빠른쪽을 먼저 검색하고 그 다음 다른 컬럼을 검색하게 된다.

Table2 (다중 컬럼 인덱스)
CREATE TABLE table2(
    uid INT(11) NOT NULL auto_increment,
    id VARCHAR(20) NOT NULL,
    name VARCHAR(50) NOT NULL,
    address VARCHAR(100) NOT NULL,
    PRIMARY KEY('uid'),
    key idx_name(name, address)    
)​

이 경우에는,
원하는 값을 바로 찾을 수 있다. INDEX를 저장할 때 name과 address를 같이 저장하기 때문이다.
즉, name과 address의 값을 같이 색인하고 검색에서도 {name}{address}로 검색을 시도한다. (ex. '홍길동경기도')

 

 

4. Django에서 Index 설정 예제

# 일반 모델
class Blog(models.Model):
   title = models.CharField(max_length=100)
   created_at = models.DateTimeField(auto_now_add=True)
   contents = models.TextField()
   
# 인덱스 설정한 모델
class Blog(models.Model):
   title = models.CharField(db_index=True, max_length=100) #title
   created_at = models.DateTimeField(auto_now_add=True)
   contents = models.TextField()

두 번째 모델을 보면,
Meta Class를 통해서 정의하는 방법이 보일 것이다.

pk는 데이터베이스에서 일반적으로 index로 지정되기 때문에, pk를 통한 탐색은 index를 이용하기 때문에 효휼적일 수 있다.
그러나, 탐색할 데이터가 많이 쌓이면 쌓일 수록, full scan의 비용이 증가하기 때문에, 위와 같이 index를 지정해준다.