부울 필드를 인덱싱하면 성능이 향상됩니까?
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★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
'source' 카테고리의 다른 글
포인터 투 포인트 슛은 C에서 어떻게 작동합니까? (그리고 언제 사용할 수 있습니까?) (0) | 2022.11.05 |
---|---|
MySQL - 우편번호 앞에 "0"을 붙이는 방법 (0) | 2022.11.05 |
HTML 양식 숨김 요소를 사용하여 배열 전달 (0) | 2022.11.05 |
복잡한 v-if 문을 사용하지 않고 VueJ가 비동기 상태를 가져옵니다. (0) | 2022.11.05 |
MySQL Nested 선택 쿼리? (0) | 2022.11.05 |