programing

mysql은 null 값을 인덱싱합니까?

nasanasas 2020. 12. 13. 09:41
반응형

mysql은 null 값을 인덱싱합니까?


인덱스 된 INT 열이 행의 90 %에 대해 0이되는 mysql 테이블이 있습니다. 0 대신 NULL을 사용하도록 해당 행을 변경하면 인덱스에서 제외되어 인덱스가 약 90 % 작아 집니까?


http://dev.mysql.com/doc/refman/5.0/en/is-null-optimization.html

MySQL은 col_name = constant_value에 사용할 수있는 col_name IS NULL에서 동일한 최적화를 수행 할 수 있습니다. 예를 들어 MySQL은 인덱스와 범위를 사용하여 IS NULL로 NULL을 검색 할 수 있습니다.


NULLs도 인덱싱하는 것처럼 보입니다 .

MySQL은 인덱스 생성 중에 WRITES를 위해 테이블을 잠그기 때문에 이것을 실행할 때주의하십시오. 열이 비어 있어도 (모두 null) 큰 테이블에서 인덱스를 작성하는 데 시간이 걸릴 수 있습니다.

참조 .


컬럼이 널이되도록 허용하면 컬럼의 스토리지 요구 사항에 바이트가 추가됩니다. 이것은 아마도 좋지 않은 인덱스 크기를 증가시킬 것입니다. 즉, 많은 쿼리가 "IS NULL"또는 "NOT NULL"을 사용하도록 변경되면 값 비교를 수행하는 것보다 전반적으로 더 빠를 수 있습니다.

내 직감은 나에게 널이 아니라고 말 하겠지만, 한 가지 답이있다 : 테스트!


아니요, 계속해서 포함되지만 두 경우 모두 결과가 무엇인지에 대해 너무 많은 가정을하지 마십시오. 다른 값의 범위 ( '카디널리티'는 Google)에 따라 많이 달라집니다.

MSSQL에는 이러한 유형의 상황에 대해 "필터링 된 인덱스"라는 새로운 인덱스 유형이 있습니다 (예 : 필터를 기반으로하는 인덱스에 레코드 포함). dBASE 유형 시스템은 비슷한 기능을 가지고 있었으며 매우 편리했습니다.


각 인덱스에는 카디널리티가 있으므로 인덱싱되는 고유 값 수를 의미합니다. AFAIK 인덱스가 여러 행에 대해 동일한 값을 반복한다고 말하는 것은 합리적이지 않지만 인덱스는 여러 행의 클러스터형 인덱스 (이 필드에 대해 null 값이있는 행)에 대해 반복 된 값만 처리하고 클러스터형 인덱스의 참조 ID를 유지합니다. 의미 : NULL 값 인덱싱 된 필드가있는 각 행은 PK만큼 큰 크기를 낭비합니다 (이러한 이유로 전문가는 복합 PK가있는 경우 적절한 PK 크기를 갖는 것이 좋습니다).

참고 URL : https://stackoverflow.com/questions/289001/does-mysql-index-null-values

반응형