본문 바로가기
Database

DB index(B-tree) 생성 후 반환 데이터 sorting 에 대해

by Super Santj 2023. 7. 25.

 

index 생성 이후 반환 데이터 sorting 구조

이번주에 업무를 보면서 당연한 내용을 생각 못하고, 이제야 명확하게 깨닫게된 내용이 있어 포스팅을 하게 되었다.

userId 라는 컬럼에 index 생성 후 userId 를 기반으로 아무 정렬 조건을 걸지 않은채 조회 하게 된다면, 생성한 index 의 sorting 조건 대로 데이터가 반환 된다는 사실을... 알게 되었다.

nodejs, mongodb 를 예를 든다면 아래와 같다.

  1. 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 }];
  1. 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 }];

느낀점

  1. index 생성의 매커니즘이 정말 데이터를 미리 정렬 해놓고 따로 보관을 하고 있다는 생각이 들었다.
    • 좀 더 공부가 필요해 보인다.
  2. mongodb 와 mysql, mariadb 모두 비슷한 매커니즘이겠다는 생각이 들었다. B-tree 인덱스는 모두 같을테니..!
  3. sort 를 사용하나 안하나 동일한 응답 구조로 나오기는 하나, sort 를 명시 해주는것이 human 실수 또는 여러 개발자들이 다 같이 하는 프로젝트에서는 좀 더 직관적이고 명확할 것 같다는 생각이 들었다.

결론

클린 코드, 직관적인 변수/함수 네이밍 모두 협업 개발을 하게 될 경우 코드로만 소통을 하는것을 지향하는 것 같아서 아무래도 동일한 응답값을 주고 알아서 정렬이 된다고는 하나, 성능상에 미치는 영향이 동일하다면 몇 글자 정도는 직접 명시 해주는 것이 모두에게 이롭지 않을까 라는 생각이 들었다.

  • 내부 매커니즘은 항상 잘 숙지 하고 있는 것이 좋을 것 같다.

댓글