programing

부울 필드 인덱싱

nasanasas 2020. 11. 2. 08:03
반응형

부울 필드 인덱싱


이것은 아마도 정말 어리석은 질문이지만 데이터베이스 테이블에서 부울 필드를 인덱싱하는 데 많은 이점이 있습니까?

비활성으로 플래그가 지정되어 대부분의 쿼리에를 포함하는 "소프트 삭제"레코드와 같은 일반적인 상황이 주어지면 WHERE deleted = 0해당 필드를 자체적으로 인덱싱하는 것이 도움이됩니까? 아니면 다른 일반적으로 검색되는 필드와 결합되어야합니다. 다른 색인?


아니.

검색되고 선택성 / 카디널리티가 높은 필드를 인덱싱합니다. 부울 필드의 카디널리티는 거의 모든 테이블에서 제거됩니다. 무엇이든 그것은 당신의 쓰기를 느리게 만들 것입니다 (오 아주 작은 양으로).

모든 쿼리가 소프트 삭제를 고려한다면 클러스터형 인덱스의 첫 번째 필드로 만들 수 있을까요?


deleted_at DATETIME 열은 무엇입니까? 두 가지 이점이 있습니다.

  1. 이름과 같은 고유 한 열이 필요한 경우 동일한 이름의 레코드를 여러 번 생성하고 일시 삭제할 수 있습니다 (deleted_at AND 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 

나는 그 필드에서 인덱싱이 작동하도록 적어도 카디널리티가 3 인 필드가 필요하다는 mysql 데이터베이스에 대해 어딘가에서 읽었다 고 생각하지만 이것을 확인하십시오.


비트 맵 인덱스 (예 : Oracle)를 지원하는 데이터베이스를 사용하는 경우 부울 열의 이러한 인덱스는없는 것보다 훨씬 유용합니다.

참고 URL : https://stackoverflow.com/questions/1844991/indexing-boolean-fields

반응형