부울 필드를 인덱싱 할 때 성능이 향상됩니까?
.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의 출력을 확인합니다.
문서에서 :
Indexes are used to find rows with specific column values quickly. Without an index, MySQL must begin with the first row and then read through the entire table to find the relevant rows. The larger the table, the more this costs. If the table has an index for the columns in question, MySQL can quickly determine the position to seek to in the middle of the data file without having to look at all the data.
I think it's also safe to say an index will not DECREASE performance in this case, so you have only to gain from it.
Actually this depends on queries you run. But, generally yes, as well as indexing a field of any other type.
'code' 카테고리의 다른 글
왜“git push --set-upstream origin (0) | 2020.09.18 |
---|---|
Python에서 루트 로거가 DEBUG 수준으로 설정되어 있는지 확인합니까? (0) | 2020.09.18 |
list.contains JSTL의 문자열 평가 (0) | 2020.09.18 |
iOS 장치 만 대상으로하는 CSS 미디어 쿼리 (0) | 2020.09.18 |
iOS 배포 서명 ID 누락 (0) | 2020.09.18 |