programing

부울 필드 인덱싱

newsource 2022. 9. 22. 00:26

부울 필드 인덱싱

데이터베이스 테이블에서 부울 필드를 인덱싱하면 많은 이점이 있습니까?

비액티브로 플래그가 붙은 "소프트 삭제" 레코드와 같은 일반적인 상황에서 대부분의 쿼리는 다음을 포함합니다.WHERE deleted = 0그 필드를 스스로 색인화하는 것이 도움이 될까요, 아니면 다른 색인에서 일반적으로 사용되는 다른 필드와 결합해야 할까요?

아니요.

검색 대상이며 선택성/가진성이 높은 필드를 인덱싱할 수 있습니다.부울 필드의 카디널리티는 거의 모든 테이블에서 지워집니다.오히려 쓰는 속도가 느려진다.

모든 쿼리가 임시 삭제를 고려하는 경우 클러스터된 인덱스의 첫 번째 필드로 만들 수 있습니까?

deleted_at DATETIME 컬럼이란 무엇입니까?두 가지 장점이 있습니다.

  1. 원하는 열과 이름이 같은 경우 동일한 이름의 레코드를 여러 번 만들고 소프트 삭제할 수 있습니다(deleted_AT name 열에 고유한 인덱스를 사용하는 경우).
  2. 최근에 삭제된 레코드를 검색할 수 있습니다.

쿼리는 다음과 같이 표시됩니다.

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