문제

무엇이 정확하게 null 성능과 저장(space)명서 MySQL?

예를 들어:

백업 에이전트나 복:1 바이트 백업 에이전트나 복 w/NULL 로 1 바이트+게 저장 NULL?

도움이 되었습니까?

해결책

에 따라 달라지는 스토리지 엔진 사용할.

에 MyISAM 형식으로 각 행은 헤더를 포함한 비트 필드 중 하나는 비트에 대한 각각의 열을 인코딩하 NULL 상태입니다.는 열 NULL 여전히 공간을,그래서 NULL 의하지 않는 저장소.보 https://dev.mysql.com/doc/internals/en/myisam-introduction.html

InnoDB,각 열에는"필드를 시작 오프셋에서"행 머리글 중 하나 또는 두 개의 바이트는 열당.높은 비트 필드에서 시작 오프셋에서 열 경우 NULL 입니다.는 경우,열을 할 필요가 없에 저장됩니다.그래서 만약 당신이 많은 NULL 입니다의 저장해야 합 현저하게 줄일 수 있습니다.보 https://dev.mysql.com/doc/internals/en/innodb-field-contents.html

편집:

NULL 비트들은 부품의 행글,당신이 선택하지 않을 추가합니다.

유일한 방법은 내가 상상할 수 있 Null 성능을 개선하는 InnoDB 페이지 데이터가 일치하지 않을 수 있습니다에 맞게 더 많은 행하는 경우 행 포함 Null.그래서 당신의 InnoDB 버퍼를 더 효과적일 수 있습니다.

그러나 나는 매우 놀랄 것 이 제공하는 중요한 성과 이점에습니다.에 대한 걱정 효과 Null 이 성능에 대한의 영역에서 마이크로 최적화입니다.당신은 당신이 당신의 다른 곳에서는 영역에서 더 신뢰할 수 있는 가치.예를 들어 추가 잘 선택한 인덱스 또는 증가하는 데이터베이스에 캐시를 할당합니다.

다른 팁

Bill의 대답은 좋지만 약간 구식입니다. 널 저장을위한 1 ~ 2 바이트 사용이 적용됩니다. Innodb 중복 행 형식에. MySQL 이후 5.0.3이므로 InnoDB가 사용됩니다 콤팩트 따라서 1 비트 만 사용하여 널을 저장하는 행 형식 (물론 하나의 바이트는 최소입니다).

nulls에 필요한 공간 = 천장 (N/8) 바이트 여기서 n은 연속 널 열의 수입니다.

  • 0 NULLS = 0 바이트
  • 1-8 널 = 1 바이트
  • 9-16 널 = 2 바이트
  • 17-24 널 = 3 바이트
  • 등...

Compact vs Redundant에 대한 공식 MySQL 사이트에 따르면 :

소형 행 형식은 일부 작업의 CPU 사용을 증가시키는 비용으로 행 저장 공간을 약 20% 감소시킵니다. 작업량이 캐시 적중률과 디스크 속도로 제한되는 일반적인 작업량 인 경우 컴팩트 한 형식은 더 빠를 수 있습니다.

빈 줄이나 0을 통해 널을 사용하는 이점 :

  • 1 null은 1 바이트가 필요합니다
  • 1 빈 문자열 1 바이트가 필요합니다 (Varchar를 가정)
  • 1 Zero는 4 바이트가 필요합니다 (int를 가정)

여기서 저축을보기 시작합니다.

  • 8 널에는 1 바이트가 필요합니다
  • 8 개의 빈 문자열에는 8 바이트가 필요합니다
  • 8 0은 32 바이트가 필요합니다

반면에, 나는 빈 줄이나 0에 널을 사용하는 것이 좋습니다. 더 조직적이고 휴대가 가능하며 공간이 적기 때문입니다. 성능을 향상시키고 공간을 절약하려면 이상한 트릭 대신 적절한 데이터 유형, 인덱스 및 쿼리를 사용하는 데 집중하십시오.

더 많은 :https://dev.mysql.com/doc/refman/5.7/en/innodb-physical-record.html

나는 Bill Karwin에 동의하지만, 나는 추가 할 것입니다. 이 MySQL 팁. 11 번은이 문제를 구체적으로 다룹니다.

우선, 빈 문자열 값과 null 값 (int 필드 : 0 vs. null) 사이에 차이가 있는지 스스로에게 물어보십시오. 둘 다 가야 할 이유가 없다면 널 필드가 필요하지 않습니다. (Oracle이 Null과 빈 문자열을 동일하다고 간주한다는 것을 알고 있습니까?)

NULL 열에는 추가 공간이 필요하며 비교 문에 복잡성을 더할 수 있습니다. 가능하면 피하십시오. 그러나 일부 사람들은 널 값을 가진 매우 구체적인 이유가있을 수 있음을 이해합니다. 이는 항상 나쁜 것은 아닙니다.

반면에, 나는 여전히 많은 줄이없는 테이블에 null을 사용합니다. 대부분은 null이 아닌 말의 논리를 좋아하기 때문입니다.

업데이트나중에 이것을 다시 방문하면 개인적으로 데이터베이스에서 NULL 대신 0을 사용하는 것을 좋아하지 않으며 권장하지 않습니다. 이것은 조심하지 않으면 응용 프로그램에서 많은 잘못된 양성을 쉽게 이끌어 낼 수 있습니다.

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

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top