data engineering

index (mongodb)

qkqhxla1 2017. 4. 20. 19:59

db에서 인덱스는 쿼리 요청 속도에 중요하다. 


http://stackoverflow.com/questions/2955459/what-is-an-index-in-sql


답변을 보면 알수있듯이 인덱스는 db에서 쿼리 검색 시 속도를 향상시키기 위해 사용된다고 한다. 

이러한 인덱스가 없으면 쿼리 검색시 db가 모든 테이블을 뒤져본다고 한다 

인덱스는 UNIQUE나 KEY값을 이용해서 만들수 있다고 한다.


현재 몽고디비에서 사용하는 인덱스는

{

    "id" : 1.0,

    "optional_id" : 1.0,

    "unique_value" : 1.0

}


같은 포멧으로 걸려있는데, 감으로 id, optional_id, unique_value에 인덱스가 걸려있음을 알수 있는데, 뒤의 1.0은 내림차순이냐, 오름차순이냐를 뜻한다. 


https://docs.mongodb.com/getting-started/shell/indexes/

페이지를 보고 알수 있다.


1은 오름차순, -1은 내림차순이라고 한다. 




인덱스가 왜 중요한지 보여주는 예제.

총 4000만건의 데이터가 있다. 여기서 특정 조건을 만족하면 update를 하려고 한다. 

db['table'].update_many({'CREATE_AT':'20170808080'},{"$set": {'row':'2222'}})


db['table'].update_many({'row':'2222'},{"$set": {'CREATE_AT':'20170808080'}})

이런식의 update인데, 서로 반대이다. row라는 값에는 인덱스가 걸려있고, CREATE_AT에는 인덱스가 걸려있지 않다.


두 쿼리를 돌렸을때 업데이트할 데이터는 다양한 4000만개중 각각 1개씩 업데이트가 된다. 


인덱스가 걸린 row를 대상으로 update를 한 db['table'].update_many({'row':'2222'},~~쿼리는

0.005초가 걸린 반면, 인덱스가 안 걸린 다른 쿼리는 93초가 걸렸다.


참고로 mysql에서도 거의 동일하다.

'data engineering' 카테고리의 다른 글

mapreduce(맵리듀스)란?  (0) 2017.05.20
docker 삽질.  (0) 2017.04.25
redis 기초.  (2) 2017.04.20
docker getting started  (0) 2017.04.17
mysql procedure 선언문 예제  (0) 2017.03.28