[mysql] 부울 필드를 인덱싱 할 때 성능이 향상됩니까?

.NET Framework를 포함하는 쿼리를 작성하려고합니다 WHERE isok=1. 이름에서 알 수 있듯이 isok는 부울 필드 (실제로는 TINYINT(1) UNSIGNED필요에 따라 0 또는 1로 설정 됨)입니다.

이 필드를 인덱싱 할 때 성능상의 이점이 있습니까? 엔진 (이 경우 InnoDB)이 인덱스 조회 성능이 더 좋거나 나쁠까요?



답변

별로. 책처럼 생각해야합니다. 책에 3 가지 종류의 단어 만 있고 모든 단어를 색인화하면 일반 페이지와 동일한 수의 색인 페이지를 갖게됩니다.

한 값의 레코드가 비교적 적 으면 성능이 향상됩니다. 예를 들어 1000 개의 레코드가 있고 그중 10 개가 TRUE 인 경우 다음을 사용하여 검색하면 유용합니다.isok = 1

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

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

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


답변

내 경험상 이와 같은 질문을 보는 사람들은 우리와 같은 보트에 있기 때문에 여기에 몇 가지 다른 답변에 대해 더 세밀하게 설명하기 위해 부울 필드를 인덱싱하는 것이 무의미하다고 들었습니다.

약 4 백만 개의 행이있는 테이블이 있는데 한 번에 약 1000 개 정도만 부울 스위치에 플래그가 지정됩니다. 이것이 우리가 검색하는 대상입니다. Boolean 필드에 인덱스를 추가하면 쿼리 속도가 몇 배나 빨라졌으며 약 9 초 이상에서 1 초 미만으로 단축되었습니다.


답변

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

사례 A : 조건 WHERE isok = 1및 다른 항목 없음 :

SELECT *
FROM tableX
WHERE isok = 1
  • 인덱스가 충분히 선택적인 경우 (예 : 1M 행이 있고 1k 만있는 경우 isok = 1) SQL 엔진은 인덱스를 사용하고 인덱스 가없는 경우보다 빠릅니다.

  • 인덱스가 충분히 선택적이지 않은 경우 (예 : 1M 행이 있고 100k 이상이 있음 isok = 1) SQL 엔진은 인덱스를 사용 하지 않고 테이블 스캔을 수행합니다.

사례 B : 상태 WHERE isok = 1및 기타 사항 :

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

그런 다음 보유한 다른 색인에 따라 다릅니다. 인덱스 는 가능한 값이 두 개 뿐인 another_column인덱스보다 더 선택적 일 수 있습니다 isok. (another_column, isok)또는 (isok, another_column)더 나은 인덱스입니다 .


답변

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

1000 페이지가 밀집된 책이 있는데 내 책의 유일한 단어는 ‘예’와 ‘아니오’가 계속 반복되고 무작위로 배포되었다고 가정 해보십시오. ‘예’의 모든 항목에 동그라미 표시를하도록 요청받은 경우 책 뒷면의 색인이 도움이 될까요? 때에 따라 다르지.

예와 아니오가 반반 씩 무작위로 분포되어 있다면 색인에서 조회하는 것이 도움이되지 않습니다. 색인은 책을 훨씬 더 크게 만들 것이고, 어쨌든 나는 각 항목을 찾는 것보다 앞면에서 시작하여 각 페이지를 통해 모든 ‘예’인스턴스를 찾아서 동그라미를 치는 것이 더 빠를 것입니다. 색인을 작성한 다음 색인 항목에서 참조하는 페이지에 대한 참조를 가져옵니다.

하지만 예를 들어 천 페이지의 책에 ‘예’가 10 개만 있고 나머지는 모두 수백만 개에 불과했다면 색인을 사용하면 ‘예’의 10 개 인스턴스를 찾아 그 주위를 돌릴 때 많은 시간을 절약 할 수 있습니다. .

데이터베이스에서도 마찬가지입니다. 50:50 배포 인 경우 인덱스가 도움이되지 않습니다. 데이터베이스 엔진은 처음부터 끝까지 데이터를 훑어 보는 것이 더 낫습니다 (전체 테이블 스캔), 인덱스는 데이터베이스를 더 크게 만들뿐입니다. 쓰기 및 업데이트 속도가 느립니다. 그러나 4000 : 1 배포와 같은 경우 ( 이 스레드의 oucil 에 따라), 찾고있는 항목이 4000 개 중 1 개이면 인덱스 검색이 속도를 크게 높일 수 있습니다.


답변

아니요, 보통은 아닙니다.

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


답변

실제로 이것은 실행하는 쿼리에 따라 다릅니다. 그러나 일반적으로 그렇습니다. 또한 다른 유형의 필드를 인덱싱합니다.


답변

예, 인덱스는 성능을 향상시키고 인덱스가 있거나없는 EXPLAIN의 출력을 확인합니다.

문서에서 :

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

나는 인덱스가되지 않습니다 말을하는 것이 안전하다고 생각 감소 당신은 단지 그것으로부터 이득 그래서,이 경우 성능.