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
'Program Tip' 카테고리의 다른 글
bash 변수를 jq select에 전달 (0) | 2020.11.04 |
---|---|
Visual Studio Code에서 도구 설명 힌트 비활성화 (0) | 2020.11.04 |
'큰 데이터베이스'란 무엇입니까? (0) | 2020.11.04 |
Boost를 사용하여 XML 파일 읽기 및 쓰기 (0) | 2020.11.04 |
LaTeX : Sum 기호가 표시되는 방식을 조정하는 방법 (0) | 2020.11.04 |