index 생성 이후 반환 데이터 sorting 구조
이번주에 업무를 보면서 당연한 내용을 생각 못하고, 이제야 명확하게 깨닫게된 내용이 있어 포스팅을 하게 되었다.
userId 라는 컬럼에 index 생성 후 userId 를 기반으로 아무 정렬 조건을 걸지 않은채 조회 하게 된다면, 생성한 index 의 sorting 조건 대로 데이터가 반환 된다는 사실을... 알게 되었다.
nodejs, mongodb 를 예를 든다면 아래와 같다.
- userId 컬럼을 기반으로 오름차순 index 생성을 하게 될 경우
UserModel.index({ userId: 1 });
// 데이터 조회
const query = { userId: { $gte: userId } };
const projection = { userId: true };
return UserModel.find(query, projection).limit(n);
// sort 가 없어도 잘 정렬이 되서 반환이 된다.
return UserModel.find(query, projection).sort({ userId: 1 }).limit(n);
// return
[{ userId: 1 }, { userId: 2 }, { userId: 3 }, ...{ userId: n }];
- userId 컬럼을 기반으로 내림차순 index 생성을 하게 될 경우
UserModel.index({ userId: -1 });
// 데이터 조회
const query = { userId: { $lte: userId } };
const projection = { userId: true };
return UserModel.find(query, projection).limit(n);
// sort 가 없어도 잘 정렬이 되서 반환이 된다.
return UserModel.find(query, projection).sort({ userId: -1 }).limit(n);
// return
[{ userId: n }, ...{ userId: 3 }, { userId: 2 }, { userId: 1 }];
느낀점
- index 생성의 매커니즘이 정말 데이터를 미리 정렬 해놓고 따로 보관을 하고 있다는 생각이 들었다.
- 좀 더 공부가 필요해 보인다.
- mongodb 와 mysql, mariadb 모두 비슷한 매커니즘이겠다는 생각이 들었다. B-tree 인덱스는 모두 같을테니..!
- sort 를 사용하나 안하나 동일한 응답 구조로 나오기는 하나, sort 를 명시 해주는것이 human 실수 또는 여러 개발자들이 다 같이 하는 프로젝트에서는 좀 더 직관적이고 명확할 것 같다는 생각이 들었다.
결론
클린 코드, 직관적인 변수/함수 네이밍 모두 협업 개발을 하게 될 경우 코드로만 소통을 하는것을 지향하는 것 같아서 아무래도 동일한 응답값을 주고 알아서 정렬이 된다고는 하나, 성능상에 미치는 영향이 동일하다면 몇 글자 정도는 직접 명시 해주는 것이 모두에게 이롭지 않을까 라는 생각이 들었다.
- 내부 매커니즘은 항상 잘 숙지 하고 있는 것이 좋을 것 같다.
댓글