데이터베이스의 성능을 향상시키기 위해 사용되는 데이터 구조입니다. 인덱스는 테이블의 특정 열에 대한 빠른 검색을 가능하게 하며, 대규모 데이터셋에서 효율적인 데이터 조회를 지원합니다.
검색 성능 향상
인덱스를 사용하면 테이블의 특정 열에 대한 검색이 훨씬 빨라집니다.
정렬 성능 향상
인덱스가 있는 열에 대해 정렬 연산이 더 효율적으로 수행됩니다.
데이터 무결성 유지
유니크 인덱스를 사용하면 데이터 중복을 방지하여 데이터 무결성을 유지할 수 있습니다.
추가 저장 공간 필요
인덱스를 생성하면 추가적인 저장 공간이 필요합니다.
쓰기 성능 저하
데이터 삽입, 삭제, 업데이트 시 인덱스도 함께 수정해야 하므로 성능이 저하될 수 있습니다.
복잡성 증가
너무 많은 인덱스를 생성하면 관리가 어려워지고, 오히려 성능 저하를 초래할 수 있습니다.
N + 1 문제는 데이터베이스와 관련된 성능 문제로, 주로 ORM(Object-Relational Mapping) 프레임워크를 사용할 때 자주 발생합니다.
한 번의 쿼리로 N개의 항목을 가져온 후, 각 항목에 대해 추가로 한 번씩(N번) 쿼리를 실행하여 관련 데이터를 가져오는 방식입니다.
결과적으로 총 N + 1번의 쿼리가 실행됩니다.
첫 번째 쿼리: 모든 사용자 정보를 가져옵니다. (1번 실행)
sql
SELECT * FROM users;
두 번째 쿼리: 각 사용자에 대해 주문 목록을 가져옵니다. (N번 실행)
sql
SELECT * FROM orders WHERE user_id = ?;
성능 저하
N개의 항목에 대해 각각 추가 쿼리를 실행하므로 데이터베이스에 많은 부하를 줄 수 있으며, 성능이 크게 저하됩니다.
네트워크 오버헤드
다수의 쿼리가 네트워크를 통해 전달되므로 네트워크 오버헤드가 발생합니다.
복잡성 증가
쿼리가 많아질수록 코드의 복잡성이 증가하며, 유지보수가 어려워집니다.
조인(Join) 사용
SELECT users.*, orders.* FROM users LEFT JOIN orders ON users.id = orders.user_id;Eager Loading 사용
ORM에서 제공하는 기능으로, 미리 관련 데이터를 로드하여 N + 1 문제를 피할 수 있습니다. 예를 들어, Django ORM에서는 select_related나 prefetch_related를 사용할 수 있습니다.
배치 쿼리 사용
여러 항목을 한 번에 가져오는 방법으로, 각 항목에 대해 별도로 쿼리를 실행하지 않고 한 번에 필요한 데이터를 가져옵니다.
N + 1 문제는 주로 성능 저하를 초래하므로, 이를 인지하고 적절한 방법을 사용해 문제를 해결하는 것이 중요합니다.
이번주 부터 팀프로젝트 과제가 시작되었다. 각자 역할 분담도 정했고 작업을 진행하기 위해 초기 기획과 일정 조율에 많은 시간을 할애했다. 의사소통은 잘되는 점이 좋았는데 기술적인 준비가 조금 미흡한 점이 있다. 이번주에 힘을 내서 잘 해봐야겠다.