EXPLAIN SELECT tbl_collection.id, tbl_collection.user_id, tbl_collection.`name`, tbl_collection.parent_id FROM tbl_collection WHERE tbl_collection.parent_id IN (1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 15, 16, 17, 18, 19, 21, 24, 28, 30, 50, 56, 58, 59, 60, 61, 62, 64, 68, 70, 71, 89, 90, 91, 97, 99, 100);
최적화하는 과정에서 데이터베이스와 Ktor에 대해 공부한 점이 많아 재미있었습니다.
계층적인 컬렉션을 구상하였을 때 '아... N+1 문제 어떻게 해결하지' 라는 생각이 먼저 들었습니다.
물론, Spring Boot JPA의
Fetch Join이나EntityGraph등 여러 방법이 있고 적용한 경험이 있지만Ktor Framework에서 해결할 수 있는지 알 수 없었기 때문에 걱정이 있었습니다.
✏️ 일단 부딪쳐보자~
여러 API를 완성하고 컬렉션 목록 가져오기 API를 만들어야 할 때가 왔습니다.
첫 번째로, 조인을 사용하는 방법을 구상했습니다.
두 번째로, Kotlin Exposed DAO를 사용했습니다.
DAO의 즉시 로딩을 사용해 같은 계층의 컬렉션을 한 번에 가져오는 쿼리를 사용할 수 있었습니다.
세 번째로, Kotlin Exposed DSL을 사용했습니다.
마지막으로, IN 쿼리의 성능을 확인했습니다.
필터링된 100개의 row에 대해 최대 37개의 아이디로 조회했을 때, Index Range Scan을 통해 접근하였습니다.
최적화하는 과정에서 데이터베이스와 Ktor에 대해 공부한 점이 많아 재미있었습니다.