피드로 돌아가기
Dev.toBackend
원문 읽기
Django ORM이 Many-to-Many 중간 테이블에서 db_index=False를 설정해 불필요한 인덱스 생성 제거
Djangonaut diaries, week 4: Eliminating a Redundant Index in Django's ORM
AI 요약
Context
Django에서 ManyToManyField를 선언하면 프레임워크가 자동으로 중간 테이블(through table)을 생성한다. 이 중간 테이블에서 외래키 필드들에 대한 인덱스가 자동으로 생성되는데, 복합 인덱스(book_id, author_id)가 이미 존재하면 단일 필드 인덱스는 중복이 된다.
Technical Solution
- create_many_to_many_intermediary_model 함수에서 "from" 필드의 ForeignKey에 db_index=False 파라미터 추가
- 복합 인덱스로 충분한 book_id 단일 필드 인덱스 제거 (UNIQUE INDEX로 이미 book_id, author_id 쌍이 커버됨)
- 테스트 코드에서 생성되는 인덱스 개수 기댓값 2에서 1로 조정
- SQLite 마이그레이션 테스트로 변경 전후 SQL 출력 비교 검증
- CI를 통한 전체 테스트 스위트 통과 확인
Key Takeaway
ORM의 자동화된 모델 생성 로직에서는 복합 인덱스 존재 여부를 고려해야 중복 인덱스를 방지할 수 있다. Python의 type() 함수로 동적 클래스를 생성할 때도 기본값의 영향을 세밀하게 제어해야 한다.
실천 포인트
Django를 사용하는 프로젝트에서 ManyToManyField로 생성되는 중간 테이블의 마이그레이션 SQL을 검토할 때, 복합 UNIQUE 인덱스 외에 단일 필드 인덱스가 중복으로 생성되지 않았는지 확인하면 불필요한 데이터베이스 메타데이터 증가를 줄일 수 있다.