인프런 커뮤니티 질문&답변

inspireworld님의 프로필 이미지

작성한 질문수

파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편

db_index=True로 설정하는 이유

24.09.13 18:16 작성

·

28

0

빈번하게 해당 필드의 값을 기준으로 select query가 일어날 만한 조건이 된다고 판단하셔서

db_index=True로 해주신걸까요?

ex) 특별한 결제 상태의 payment만 조회

Payment 모델 만드실 때 특별한 설명이 없으셔서, 질문 남겨요.

답변 2

0

이진석님의 프로필 이미지
이진석
지식공유자

2024. 09. 14. 12:10

안녕하세요. :-)

아래 "인트런 AI 인턴"의 답변도 훌륭하네요. 꼭 참고해보시구요.

결제 상태에 대한 조회는 빈번하게 일어날 수 있거든요.
데이터베이스에서 인덱스를 만드는 것도 추가적인 비용이 발생할 수 있지만,
인덱스를 만들어두는 것이 데이터베이스 조회에 유리할 수 있기 때문입니다.

데이터 크기가 적을 때에는 인덱스가 없어도 대개 잘 동작합니다.

살펴보시고 댓글 남겨주세요.

화이팅입니다.

inspireworld님의 프로필 이미지
inspireworld
질문자

2024. 09. 19. 15:11

감사합니다. 저도 좀 찾아보니 빈번하게 변경하는 필드가 아니고, 해당 필드를 filter 등으로 조건으로 사용을 자주하는 경우라면 db_index를 True로 주는게 좋다고 하네요.

ORM에서 필드마다 index를 자동으로 생성하는 것 같은데, 이 경우 필드가 업데이트 되면 index 값도 변경 될 것 같은데 맞을까요?

이진석님의 프로필 이미지
이진석
지식공유자

2024. 09. 19. 15:17

db_index=True 지정을 하시면, 장고에서는 데이터베이스 마이그레이션 과정 (makemigrations 명령과 migrate 명령)에서 해당 테이블/컬럼 생성 시에 CREATE TABLE 쿼리 외에 CREATE INDEX 쿼리를 추가로 수행해줍니다.

그럼, ORM 사용하시거나 직접 SQL 쿼리를 수행하시더라도 해당 컬럼 값의 변화가 있을 때, 데이터베이스 단에서 자동으로 index가 자동으로 갱신됩니다. 즉 데이터베이스의 인덱스 생성을 ORM에서 수행해주는 것은 아닙니다. 마이그레이션 과정에만 참여합니다.

db_index=True 설정은 단일 컬럼에 대해서만 인덱스를 생성하는 것이구요. 한 번에 여러 컬럼에 대해서 조회를 하실 때에는 그때 사용할 "여러 컬럼"에 대해서 인덱스 생성이 필요하실 수 있습니다. 이때에는 모델에 Meta.indexes 설정을 사용하구요. 단일 컬럼 인덱스에서도 db_index=True보다 Meta.indexes 설정을 사용하시면, 보다 디테일하게 인덱스 설정을 하실 수 있습니다. :-)

inspireworld님의 프로필 이미지
inspireworld
질문자

2024. 09. 20. 11:52

팁 감사합니다^^

추가적으로 궁금한 사항이 있습니다.

  1. 컬럼 값이 자주 변하는 필드라면 db_index를 설정하지 않는게 좋을 것 같은데, 혹시 그 기준이 있을까요?

예상되는 비율이 갱신:조회 비율이 1:10보다 낮을 경우 라던지,

  1. 특별한 기준이 없다면 직감적으로 값의 변경이 거의 없을 것 같고 조건 절로 자주 사용될 만한 필드들이라면 지정을 하고 향후 오버헤드가 생기는 경우에 대응을 하시는 편인가요?

  2. 추가로 오버헤드가 발생할 때 실서버에서 쉽게 포착할 수 있는 툴이나 서드파티 패키지가 있을까요?

이진석님의 프로필 이미지
이진석
지식공유자

2024. 09. 21. 15:45

컬럼 값의 변경 빈도보다 데이터 양이 중요한 포인트라고 생각하구요. 데이터 양이 아주 많은 경우, Full Table Scan이 아니라 Index Scan이 더 빠르게 조회가 될 경우 인덱스가 필요하겠구요.

한 테이블에서 너무 많은 컬럼에 대해서 여러 인덱스를 잡게 되면, 인덱스 생성 비용이 많이 들어가, 인덱스 저장 공간도 소모될테니깐요. (인덱스도 별도의 테이블로 보실 수 있습니다.) Trade off가 있구요. 필요한 만큼만 인덱스를 생성하셔야하실 것입니다.

장고 View를 통해 매 페이지가 렌더링될 때 django-debug-toolbar를 통해서도 그 페이지가 렌더링될 때 사용된 쿼리의 종류와 개수, 실행계획을 확인하실 수 있으니까, 꼭 확인이 필요합니다.

데이터베이스에서 slow query 로그를 확인하실 수도 있겠구요. APM (애플리케이션 성능 모니터링) 서비스를 사용하시면, 장고 애플리케이션과 데이터베이스, nginx 에서의 성능을 통합적으로 모니터링하실 수 있습니다. data dog, newrelic, sentry 등의 서비스가 있습니다.

inspireworld님의 프로필 이미지
inspireworld
질문자

2024. 09. 23. 08:31

감사합니다. 많은 도움 되었습니다.ㅎ

0

인프런 AI 인턴님의 프로필 이미지

2024. 09. 13. 18:21

안녕하세요, 인프런 AI 인턴입니다. inspireworld님.

db_index=True 설정은 해당 필드에 인덱스를 생성하여 조회 성능을 향상시킵니다. 특히 자주 조회되는 필드나 검색 조건에 사용되는 필드에 인덱스를 설정하는 것이 유리합니다. 인덱스가 있으면 데이터베이스가 원하는 데이터를 더 빠르게 찾을 수 있습니다.

관련 질문과 답변 URL:

요약
- db_index=True: 데이터베이스 필드에 인덱스를 생성하여 검색을 빠르게 함.
- 자주 조회되는 필드에 적용: 검색 속도를 높이기 위해 자주 조회되거나 조건으로 사용되는 필드에 적용.
- 실제 사용 예시: 특별한 결제 상태의 payment 조회 등.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.