Database

[DataBase] typeORM find시 어떤 칼럼을 기준으로 찾아야 빠를까?

반응형

프로젝트로 nestJS 와 Mysql(TypeORM)을 사용했습니다. entity에서 find 혹은 findOne을 하는 경우 unique한 값인 id 값으로 찾아오는 경우가 있는데 다른 칼럼(예를 들면 email)도 unique할 수 있습니다. 따라서 email로 찾아도 값은 동일할 것입니다.

여기서 id값과 email의 차이는 id의 경우 auto increment로 설정되어있고 email은 그렇지 않다는 점입니다. 이 경우 email은 랜덤하기 때문에 시간이 오래 걸릴 것이고 id값은 정렬되어있기 때문에 빠르게 탐색할 것이다.라는게 저의 가정이었습니다. 

 

하지만 검색 결과 DB는 B-Tree라는 다른 자료 구조를 가진다는 것을 알았습니다.


B-Tree

자료구조는 2가지로 나뉘는데 선형 자료구조와 비선형 자료구조로 나뉩니다. Tree는 비선형 자료구조 중 하나로 평균 탐색 시간복잡도는 O(logN)을 가집니다.

 

여기서 생기는 의문점은 hash table 이었습니다. 탐색 시간이 가장빠른 Hash Table을 사용하지 않는 이유는 데이터를 탐색할 때 등호 뿐만 아닌 부등호 등으로 여러 데이터를 검색할 때 불리합니다.

 

 

DB 자료구조로 B-Tree를 사용하는 이유는 B-Tree는 노드 하나에 여러 데이터가 저장될 수 있습니다. 각 노드 내에서 데이터들은 항상 정렬되어 있는 상태이며, 데이터와 데이터 사이의 범위를 이용하여 자식 노드를 가집니다. 그러므로 자식 노드 개수는 (n + 1)을 가집니다.


따라서 id든 email이든 인덱스를 설정하지 않는다면 데이터를 검색할 때 차이가 없다는 것을 알았습니다. 그럼에도 불구하고 id값으로 찾아야하는 이유는 정규화입니다. id값은 인덱스로서의 역할만을 수행해야 확장성을 가질 수 있습니다. 이것이 email등을 id로 사용해서는 안되는 이유입니다.

반응형

'Database' 카테고리의 다른 글

[SQL] Subquery  (0) 2022.04.20
[SQL] Inner Join, Left Join, Union  (0) 2022.04.20
[WIL] ORM, noSQL vs SQL  (0) 2022.04.17
[Database] ORM과 DB의 차이  (0) 2022.04.12