부울 필드 인덱싱
데이터베이스 테이블에서 부울 필드를 인덱싱하면 많은 이점이 있습니까?
비액티브로 플래그가 붙은 "소프트 삭제" 레코드와 같은 일반적인 상황에서 대부분의 쿼리는 다음을 포함합니다.WHERE deleted = 0
그 필드를 스스로 색인화하는 것이 도움이 될까요, 아니면 다른 색인에서 일반적으로 사용되는 다른 필드와 결합해야 할까요?
아니요.
검색 대상이며 선택성/가진성이 높은 필드를 인덱싱할 수 있습니다.부울 필드의 카디널리티는 거의 모든 테이블에서 지워집니다.오히려 쓰는 속도가 느려진다.
모든 쿼리가 임시 삭제를 고려하는 경우 클러스터된 인덱스의 첫 번째 필드로 만들 수 있습니까?
deleted_at DATETIME 컬럼이란 무엇입니까?두 가지 장점이 있습니다.
- 원하는 열과 이름이 같은 경우 동일한 이름의 레코드를 여러 번 만들고 소프트 삭제할 수 있습니다(deleted_AT name 열에 고유한 인덱스를 사용하는 경우).
- 최근에 삭제된 레코드를 검색할 수 있습니다.
쿼리는 다음과 같이 표시됩니다.
SELECT * FROM xyz WHERE deleted_at IS NULL
특히 지수를 커버하는 데 도움이 될 것 같습니다.
물론 데이터 및 쿼리에 따라 얼마나 많은지 또는 적은지에 따라 달라집니다.
인덱스에 관한 모든 이론을 가질 수 있지만 최종 답은 실제 데이터가 포함된 데이터베이스의 데이터베이스 엔진에 의해 제공됩니다.그리고 종종 당신은 그 대답에 놀란다(혹은 내 이론이 너무 나쁜 것일 수도 있다).
쿼리의 쿼리 계획을 검토하여 쿼리를 개선할 수 있는지 또는 인덱스를 개선할 수 있는지 확인합니다.인덱스를 변경하여 어떤 차이가 있는지 확인하는 것은 매우 간단합니다.
뷰(삭제된 경우 = 0)를 사용하고 이 뷰에서 정기적으로 쿼리를 수행하는 것이 도움이 될 것입니다.
부울 필드가 많은 경우 참조할 수 있는 경우 별도의 테이블(예: DeletedPages 또는 SpecialPages)을 갖는 것이 타당하다고 생각합니다.이 예에서는 다음과 같은 부울 유형 필드가 많이 있습니다.is_deleted
,is_hidden
,is_really_deleted
,requires_higher_user
그 다음에 그걸 얻기 위해 가입하는 거죠
일반적으로 이 테이블의 크기는 더 작으며 특히 코드 가독성과 유지보수성에 관한 한 조인하면 이점을 얻을 수 있습니다.이러한 유형의 쿼리의 경우:
select all pages where is_deleted = 1
다음과 같이 구현하는 것이 더 빠릅니다.
select all pages where pages
inner join DeletedPages on page.id=deleted_pages.page_id
mysql 데이터베이스에 대해 어디서 읽은 것 같습니다만, 그 필드에 인덱스를 작성하려면 적어도 3의 카디널리티가 필요합니다만, 확인해 주세요.
비트맵 인덱스를 지원하는 데이터베이스(예: Oracle)를 사용하는 경우 부울 열의 인덱스가 없는 경우보다 훨씬 유용합니다.
언급URL : https://stackoverflow.com/questions/1844991/indexing-boolean-fields
'programing' 카테고리의 다른 글
Eclipse에서 Maven 종속성을 추가하려면 어떻게 해야 합니까? (0) | 2022.09.22 |
---|---|
스프링 저장소 내에서 원시 SQL을 사용할 수 있습니까? (0) | 2022.09.22 |
Prop 값으로 데이터 속성을 초기화하는 방법 (0) | 2022.09.22 |
명령줄에서 대용량 SQL 파일을 MySql로 가져오는 중 (0) | 2022.09.22 |
Eclipse - "호환성이 없는 JVM.JVM 버전 1.8.0_261은 이 제품에 적합하지 않습니다.버전: 11 이상 필요" (0) | 2022.09.22 |