programing

열 1의 부분 집합 및 열 2의 범위에 대한 쿼리에 대한 MariaDB 인덱스

easyjava 2023. 9. 21. 21:36
반응형

열 1의 부분 집합 및 열 2의 범위에 대한 쿼리에 대한 MariaDB 인덱스

다음과 같은 문의가 있습니다.

SELECT column1 FROM table WHERE column2 IN (*small set of values*) AND column3 > number

제 테이블에는 3개의 열이 있으며, 기본 키는 (1열, 2열)입니다.

그래서 복합 지수를 조사하고 있었지만 이 복합 지수에 대한 B트리가 정확히 어떻게 구축될 것인지에 대한 정보가 많지 않기 때문에 인덱스의 열을 어떤 순서로 (열2, 열3) 또는 (열3, 열2)로 해야 하는지가 매우 명확하지 않습니다(적어도 이해할 수 없었습니다).

그렇다면 트리는 어떻게 만들어지며 예를 들어 열 2에 대해서만 생성하고 색인화하는 것보다 더 많은 도움이 될까요?

보너스 질문:저는 여기서 '커버링' 지수에 대해 뭔가를 봤는데, '무상급식'이 없는 걸 보니, 이게 무슨 의미가 있나요?기억력에 맞는 지수가 적다고요?MariaDB는 인덱스를 메모리에 저장하기도 합니까?

(InnoDB를 사용하고 있다고 가정합니다.)

  • INDEX(col2, ...)더 좋을 것입니다.IN보다 더 선택적입니다.>.
  • INDEX(col3, ...)더 좋을 것입니다.>좀 더 선별적입니다
  • InnoDB는 항상 다음을 입력합니다.PRIMARY KEY각 보조 인덱스 끝에 있는 열.이런 이유로,INDEX(col2, col3)와 매우 유사합니다.INDEX(col2, col3, col1), 그것은 "covering" 입니다.Ditto for(col3, col2).
  • PK가 추가될 것으로 예상할 때 명시적으로 추가합니다. 이는 다른 사용자(그리고 나 자신)에게 '커버'를 위해 노력했던 단서입니다.
  • Optimizer(cf "MRR")를 통해 도약할 수 있습니다.IN값들, 그러니까...

구체적으로 다음을 추천합니다.

INDEX(col2,        -- hoping to leapfrog
      col3,        -- assuming the leapfrogging works
      col1)        -- covering

다음으로 변경하는 것이 더 나을 수 있습니다.PRIMARY KEY(col2, col1)추가 지수는 없습니다.이것은 당신이 그들을 보호하지 않았다는 것을 가정합니다.col1PK에서 먼저 다른 쿼리/쿼리에 도움이 됩니다.

BT트리에서 합성 지수는 어떻게 이루어집니까?열(col1, col2)을 연결하여 하나의 키를 만드는 것을 생각합니다. (자세한 내용은 더 엉망일 수 있지만, 이렇게 생각하면 "효과가 있습니다.")

추가 참고 사항:데이터는 PK에 따라 순서가 지정된 데이터의 B 트리입니다.보조 인덱스는 보조 인덱스에 있는 열의 B트리에 PK를 더한 값이며 리프 노드에는 추가 정보가 없습니다.

MySQL과 MariaDB는 디스크에 모든 인덱스를 저장한 다음(위 참조), RAM에 있는 "buffer_pool"에 16KB 블록을 캐시합니다.시스템이 잠시 실행된 후 인덱스 블록은 해당 캐시에 있는 경향이 있으며, 데이터 블록은 실행될 수도 있고 실행되지 않을 수도 있습니다.

에서 ""로 입니다.AUTO_INCREMENT이 있는 d는 램면 된"됩니다.

그것이 바로 "캐싱"의 묘미입니다. 여러분은 더 어설픈 기술보다는 "무료 식사"에 더 가까워집니다.예를 들면..."모든 인덱스를 RAM에 로드하겠습니다." 하지만 RAM의 다른 용도를 압도하는 '새로운' 부분만 사용한다면 어떻게 될까요? "이 테이블을 RAM에 잠글 것입니다." 다시 한번, 이는 더 효과적일 수 있는 RAM의 다른 용도를 도용하는 것입니다.

언급URL : https://stackoverflow.com/questions/53110243/mariadb-index-for-queries-of-a-subset-of-column1-and-range-of-column2

반응형