source

부울 필드를 인덱싱하면 성능이 향상됩니까?

manysource 2022. 11. 5. 17:37

부울 필드를 인덱싱하면 성능이 향상됩니까?

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★WHERE isok=1알 수 있듯이, '아예'는isok는 「」입니다TINYINT(1) UNSIGNED(0으로 0으로 1로 1로 하다.

이 필드를 인덱싱하면 성능이 향상됩니까?엔진(이 경우 InnoDB)의 성능이 더 좋습니까, 아니면 더 나쁘습니까?

여기서 몇 가지 다른 답을 더 자세히 말씀드리면, 제 경험상, 이런 질문을 하는 사람들은 우리와 같은 처지에 있기 때문입니다. 우리 모두는 부울 필드를 인덱싱하는 것이 무의미하다고 들었지만...

테이블에는 약 400만 행이 있으며, 한 번에 약 1000개 정도만 부울 스위치에 플래그가 부착되어 검색 대상이 됩니다.Boolean 필드에 인덱스를 추가하면 쿼리 속도가 약 9초 이상에서 1초 미만으로 빨라졌습니다.

사실 그렇지 않아요.책처럼 생각해야죠.만약 책에 3종류의 단어만 있고 그것들을 모두 색인화한다면, 당신은 일반 페이지와 같은 수의 색인 페이지를 갖게 될 것이다.

한 가지 값의 기록이 상대적으로 적으면 성능이 향상됩니다.들어 그 중의 레코드를 TRUE로 합니다.isok = 1

Michael Durrant가 언급했듯이, 쓰기 속도도 느려집니다.

편집: 중복 가능성:부울 필드 인덱싱

여기서 설명하는 것은 인덱스가 있더라도 레코드가 너무 많으면 인덱스를 사용하지 않는다는 것입니다.MySQL은 = 1을 확인할 때 인덱스를 사용하지 않지만 = 0과 함께 사용합니다.

실제 쿼리와 인덱스/쿼리 조합의 선택성에 따라 달라집니다.

케이스 A: 조건WHERE isok = 1그 외에는 아무것도 없습니다.

SELECT *
FROM tableX
WHERE isok = 1
  • 만 있는 )isok = 1그러면 SQL 엔진은 인덱스를 사용하고 인덱스를 사용하지 않는 것보다 더 빠를 수 있습니다.

  • 이지 않은 가 넘는 행이 있는 )isok = 1그러면 SQL 엔진은 인덱스를 사용하지 않고 테이블 스캔을 수행합니다.

케이스 B: 조건WHERE isok = 1타타: :

SELECT *
FROM tableX
WHERE isok = 1
  AND another_column = 17

그런 다음 가지고 있는 다른 인덱스에 따라 달라집니다. on on 。another_column아마도 지수보다 더 선택적일 것이다isok이치노 on on 。(another_column, isok) ★★★★★★★★★★★★★★★★★」(isok, another_column)아, 네, 네, 네.

데이터의 분포에 따라 다릅니다.

1000페이지나 되는 타이핑된 책이 있다고 상상해 보세요.그리고 제 책에 있는 단어라고는 '네'와 '아니오'가 몇 번이고 반복되어 무작위로 배포되었습니다.'예'의 모든 예에 동그라미를 치라고 하면 책 뒤에 있는 색인이 도움이 될까요?사정에 따라 다르겠지.

만약 예와 아니오의 반반 랜덤 분포가 있다면, 지수를 찾아보는 것은 도움이 되지 않을 것이다.인덱스를 사용하면 책이 훨씬 커집니다.어쨌든 인덱스의 각 항목을 찾아 인덱스 엔트리에서 참조를 참조하는 페이지로 이동하는 것보다 전면에서 시작하여 각 페이지를 통해 모든 예를 찾아 동그라미를 치는 것이 더 빠릅니다.

하지만, 예를 들어, 제 천 페이지짜리 책에 '예'의 예가 10개만 있고, 다른 모든 것이 수백만 개의 '아니오'만 있다면, 인덱스는 그 10개의 예를 찾아 동그라미를 치는 데 많은 시간을 절약해 줄 것입니다.

데이터베이스에서도 마찬가지입니다.50:50 분포의 경우 인덱스는 도움이 되지 않습니다.데이터베이스 엔진은 처음부터 끝까지(풀테이블 스캔) 데이터를 처리하는 것이 좋습니다.데이터베이스의 사이즈는 커지기만 하고, 기입과 갱신은 늦어집니다.그러나 (이 스레드의 oucil에 따라) 4000:1 분포와 같은 경우에는 인덱스 탐색을 통해 찾는 항목이 4000개 중 1개라면 속도가 크게 향상될 수 있습니다.

아니, 보통은 그렇지 않아.

일반적으로 선택성/가진성이 높을 때 검색하기 위해 필드를 색인화합니다.부울 필드의 카디널리티는 대부분의 테이블에서 매우 낮습니다.또한 쓰기 속도가 다소 느려질 수 있습니다.

실제로는 실행하는 쿼리에 따라 달라집니다.그러나 일반적으로 그렇습니다. 다른 유형의 필드도 인덱싱할 수 있습니다.

예, 두 값의 카디널리티가 1:100이라고 가정합니다. 즉, 1 참의 경우 거짓 열이 100개이고 이득이 유의합니다.내 테이블 중 하나는 1:10000 이었고 테이블은 비대했다.큰 jons가 많고 HTML(64KB)이 컬럼에 있었다.select * query with index는 카디널리티 1의 데이터에 대해 10sec에서1ms의 쿼리를 가져왔다.

예, 인덱스는 성능을 향상시킵니다. 인덱스를 포함하거나 포함하지 않고 EXPLY의 출력을 확인합니다.

문서에서:

인덱스는 특정 열 값이 있는 행을 빠르게 찾는 데 사용됩니다.인덱스가 없으면 MySQL은 첫 번째 행부터 시작하여 테이블 전체를 읽고 관련 행을 찾아야 합니다.테이블이 클수록 비용이 많이 듭니다.테이블이 문제의 컬럼에 대한 인덱스를 가지고 있는 경우 MySQL은 모든 데이터를 볼 필요 없이 데이터 파일 중간에서 찾아야 할 위치를 빠르게 결정할 수 있습니다.

이 경우 지수가 실적을 떨어뜨리지 않는다고 해도 무방할 것 같기 때문에, 그것으로부터 이익을 얻을 수 밖에 없다고 생각합니다.

색인은 지도일 뿐입니다.is_xxx가 true로 설정된 모든 행을 취득하는 것은 O(1)입니다.테이블 전체를 스캔하여 O(n)인 각 행에 대해 이 술어를 확인해야 합니다.

언급URL : https://stackoverflow.com/questions/10524651/is-there-any-performance-gain-in-indexing-a-boolean-field