부울 필드 인덱싱
이것은 아마도 정말 어리석은 질문이지만 데이터베이스 테이블에서 부울 필드를 인덱싱하는 데 많은 이점이 있습니까?
비활성으로 플래그가 지정되어 대부분의 쿼리에를 포함하는 "소프트 삭제"레코드와 같은 일반적인 상황이 주어지면 WHERE deleted = 0
해당 필드를 자체적으로 인덱싱하는 것이 도움이됩니까? 아니면 다른 일반적으로 검색되는 필드와 결합되어야합니다. 다른 색인?
아니.
검색되고 선택성 / 카디널리티가 높은 필드를 인덱싱합니다. 부울 필드의 카디널리티는 거의 모든 테이블에서 제거됩니다. 무엇이든 그것은 당신의 쓰기를 느리게 만들 것입니다 (오 아주 작은 양으로).
모든 쿼리가 소프트 삭제를 고려한다면 클러스터형 인덱스의 첫 번째 필드로 만들 수 있을까요?
deleted_at DATETIME 열은 무엇입니까? 두 가지 이점이 있습니다.
- 이름과 같은 고유 한 열이 필요한 경우 동일한 이름의 레코드를 여러 번 생성하고 일시 삭제할 수 있습니다 (deleted_at AND 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
나는 그 필드에서 인덱싱이 작동하도록 적어도 카디널리티가 3 인 필드가 필요하다는 mysql 데이터베이스에 대해 어딘가에서 읽었다 고 생각하지만 이것을 확인하십시오.
비트 맵 인덱스 (예 : Oracle)를 지원하는 데이터베이스를 사용하는 경우 부울 열의 이러한 인덱스는없는 것보다 훨씬 유용합니다.
참고 URL : https://stackoverflow.com/questions/1844991/indexing-boolean-fields
'programing' 카테고리의 다른 글
RxJava에서 Observable을 연결할 때 변수를 전달하는 방법은 무엇입니까? (0) | 2020.11.02 |
---|---|
REST 및 인증 변형 (0) | 2020.11.02 |
Python 속성은 어떻게 작동합니까? (0) | 2020.11.02 |
C ++ 11 범위 기반 for 루프에서 요소의 위치를 찾으십니까? (0) | 2020.11.01 |
ng-click 함수에 바인딩 된 변수를 어떻게 전달할 수 있습니까? (0) | 2020.11.01 |