.NET Framework를 포함하는 쿼리를 작성하려고합니다 WHERE isok=1
. 이름에서 알 수 있듯이 isok
는 부울 필드 (실제로는 TINYINT(1) UNSIGNED
필요에 따라 0 또는 1로 설정 됨)입니다.
이 필드를 인덱싱 할 때 성능상의 이점이 있습니까? 엔진 (이 경우 InnoDB)이 인덱스 조회 성능이 더 좋거나 나쁠까요?
.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 초 미만으로 단축되었습니다.
WHERE my_col > 0
대신에 my_col = 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은 모든 데이터를 볼 필요없이 데이터 파일 중간에서 찾을 위치를 신속하게 결정할 수 있습니다.
나는 인덱스가되지 않습니다 말을하는 것이 안전하다고 생각 감소 당신은 단지 그것으로부터 이득 그래서,이 경우 성능.
TINYINT(1) UNSIGNED
열은 데이터 크기가 작습니다.