Program Tip

MySQL의 NULL (성능 및 스토리지)

programtip 2020. 11. 4. 08:16
반응형

MySQL의 NULL (성능 및 스토리지)


null은 MySQL에서 성능과 저장 공간 (공간)이 정확히 무엇입니까?

예를 들면 :

TINYINT : 1 바이트 TINYINT w / NULL 1 바이트 + 어떻게 든 NULL을 저장합니까?


사용하는 스토리지 엔진에 따라 다릅니다.

MyISAM 형식에서 각 행 헤더에는 NULL 상태를 인코딩하기 위해 각 열에 대해 1 비트가있는 비트 필드가 포함됩니다. NULL 인 열은 여전히 ​​공간을 차지하므로 NULL은 저장소를 줄이지 않습니다. https://dev.mysql.com/doc/internals/en/myisam-introduction.html을 참조 하십시오.

InnoDB에서 각 열은 행 헤더에 "필드 시작 오프셋"이 있으며 열당 1 바이트 또는 2 바이트입니다. 해당 필드 시작 오프셋의 상위 비트는 열이 NULL 인 경우 켜집니다. 이 경우 열을 전혀 저장할 필요가 없습니다. 따라서 NULL이 많으면 저장 공간을 크게 줄여야합니다. 참조 https://dev.mysql.com/doc/internals/en/innodb-field-contents.html를

편집하다:

NULL 비트는 행 헤더의 일부이며 추가하도록 선택하지 않습니다.

성능을 향상시키는 NULL을 상상할 수있는 유일한 방법은 InnoDB에서 행에 NULL이 포함 된 경우 데이터 페이지가 더 많은 행에 맞을 수 있다는 것입니다. 따라서 InnoDB 버퍼가 더 효과적 일 수 있습니다.

그러나 이것이 실제로 상당한 성능 이점을 제공한다면 매우 놀랄 것입니다. NULL이 성능에 미치는 영향에 대한 걱정은 마이크로 최적화 영역에 있습니다. 당신은 돈을 더 많이 벌 수있는 분야의 다른 곳에 집중해야합니다. 예를 들어 잘 선택된 인덱스를 추가하거나 데이터베이스 캐시 할당을 늘립니다.


Bill의 대답은 좋지만 약간 구식입니다. NULL을 저장하기 위해 1 바이트 또는 2 바이트를 사용하는 것은 InnoDB REDUNDANT 행 형식 에만 적용 됩니다 . MySQL 5.0.3 InnoDB는 NULL을 저장하는 데 1 비트 만 사용하는 COMPACT 행 형식을 사용하므로 (물론 1 바이트가 최소값 임) :

NULL에 필요한 공간 = CEILING (N / 8) 바이트 여기서 N은 행의 NULL 열 수입니다.

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

COMPACT vs REDUNDANT에 대한 공식 MySQL 사이트에 따르면 :

압축 행 형식은 일부 작업에서 CPU 사용을 늘리는 대신 행 저장 공간을 약 20 % 줄입니다. 작업 부하가 캐시 적중률 및 디스크 속도로 제한되는 일반적인 작업 인 경우 압축 형식이 더 빠를 수 있습니다.

빈 문자열 또는 0보다 NULLS 사용의 이점 :

  • 1 NULL에는 1 바이트가 필요합니다.
  • 1 빈 문자열에는 1 바이트 필요 (VARCHAR 가정)
  • 1 0에는 4 바이트가 필요합니다 (INT 가정)

여기에서 절감 효과를보기 시작합니다.

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

반면에 빈 문자열이나 0보다 NULL을 사용하는 것이 좋습니다. 더 체계적이고 이식 가능하며 공간이 덜 필요하기 때문입니다. 성능을 향상시키고 공간을 절약하려면 이상한 트릭 대신 적절한 데이터 유형, 인덱스 및 쿼리를 사용하는 데 집중하십시오.

추가 정보 : https://dev.mysql.com/doc/refman/5.7/en/innodb-physical-record.html


이 MySQL 팁을 추가하더라도 Bill Karwin에 동의합니다 . 11 번은이를 구체적으로 설명합니다.

우선, 빈 문자열 값과 NULL 값 사이에 차이가 있는지 스스로에게 물어보십시오 (INT 필드의 경우 : 0 대 NULL). 둘 다 가질 이유가 없으면 NULL 필드가 필요하지 않습니다. (오라클이 NULL과 빈 문자열을 동일한 것으로 간주한다는 것을 알고 계셨습니까?)

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

반면에, 나는 여전히 많은 행이없는 테이블에서 여전히 널을 사용하는데, 주로 NOT NULL을 말하는 논리를 좋아하기 때문입니다.

업데이트 재 방문이 후, 나는 개인적으로 데이터베이스에 사용되는 0 대신에 NULL을 좋아하지 않아 추가합니다, 나는 그것을 사용하지 않는 것이 좋습니다. 주의하지 않으면 응용 프로그램에서 많은 오탐으로 쉽게 이어질 수 있습니다.


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을 검색 할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/229179/null-in-mysql-performance-storage

반응형