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 |