복붙노트

[SQL] MySQL은 NULL (성능 및 스토리지)

SQL

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

무엇 정확히 MySQL의에서 현명 성능과 저장 (공간)을 할 NULL합니까?

예를 들면 :

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

해결법

  1. ==============================

    1.그것은 당신이 사용하는 스토리지 엔진에 따라 달라집니다.

    그것은 당신이 사용하는 스토리지 엔진에 따라 달라집니다.

    의 MyISAM 형식으로, 각 행 헤더 인코딩 NULL 상태로 각 열에 대해 하나의 비트와 비트 필드를 포함한다. 널의 스토리지를 감소시키지 않도록 NULL이 여전히 열은 공간을 차지합니다. https://dev.mysql.com/doc/internals/en/myisam-introduction.html 참조

    이노에서, 각각의 컬럼은 컬럼 당 하나 또는 두 바이트 행 헤더에 "필드 개시 오프셋」이있다. 오프셋 필드의 시작에서 높은 비트 열이 NULL 인 경우에 있습니다. 이 경우, 열은 모든 저장 할 필요가 없습니다. 그래서 당신이있는 경우에 NULL 많은 스토리지가 크게 감소해야합니다. https://dev.mysql.com/doc/internals/en/innodb-field-contents.html 참조

    편집하다:

    널 (NULL) 비트는 행 머리글의 일부입니다, 당신은 그 (것)들을 추가 할 수 없습니다.

    내가 널 (NULL)이 성능을 향상 상상할 수있는 유일한 방법은 행에 NULL을 사용할 경우 이노에서, 데이터의 페이지가 많은 행에 맞게 수 있다는 것이다. 그래서 InnoDB의 버퍼가 더 효과적 일 수 있습니다.

    이 실제로 상당한 성능 이점을 제공하지만 나는 매우 놀랄 것입니다. 널 (NULL)이 성능에 미치는 영향에 대해 걱정하는 것은 마이크로 최적화의 영역에있다. 당신은 벅에 대한 더 큰 강타를 제공 분야에서 관심의 다른 곳을 집중해야한다. 예를 들어 잘 선택 인덱스를 추가하거나 데이터베이스 캐시 할당을 증가.

  2. ==============================

    2.빌의 대답은 좋지만, 조금 오래된 비트. NULL을 저장하기위한 하나 또는 두 개의 바이트만을 사용 이노 REDUNDANT 행 포맷에 적용된다. 5.0.3 이노가 NULL를 저장하는 하나의 비트를 사용 COMPACT 로우 포맷을 사용하기 때문에, 따라서, (물론, 1 바이트의 최소이다)

    빌의 대답은 좋지만, 조금 오래된 비트. NULL을 저장하기위한 하나 또는 두 개의 바이트만을 사용 이노 REDUNDANT 행 포맷에 적용된다. 5.0.3 이노가 NULL를 저장하는 하나의 비트를 사용 COMPACT 로우 포맷을 사용하기 때문에, 따라서, (물론, 1 바이트의 최소이다)

    N은 행 NULL 열의 수이며 NULL 값 = CEILING위한 필요한 공간 (N / 8) 바이트.

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

    당신은 여기에서 절감 효과를보고 시작합니다

    그들은 더 많은 휴대용 조직하고 있으며, 적은 공간을 필요로하기 때문에 다른 한편으로는, 나는, 빈 문자열 또는 제로 이상 널 (null)을 사용하는 것이 좋습니다. 대신 이상한 트릭의 적절한 데이터 형식, 인덱스 및 쿼리를 사용하여 성능과 공간 절약, 초점을 향상시킬 수 있도록 지원합니다.

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

  3. ==============================

    3.나는이 MySQL의 팁을 추가 할 수 있지만 나는, 빌 Karwin에 동의합니다. 번호 (11)는 주소이 특별히를 :

    나는이 MySQL의 팁을 추가 할 수 있지만 나는, 빌 Karwin에 동의합니다. 번호 (11)는 주소이 특별히를 :

    반면에, 나는 아직도 대부분 I 때문에 NULL NOT 말의 논리처럼, 행의 톤이없는 테이블에 널 (null)을 사용합니다.

    최신 정보 나중에 재 방문, 나는 개인적으로 데이터베이스에 사용되는 0 대신에 NULL을 좋아하지 않아 추가합니다, 나는 그것을 사용하지 않는 것이 좋습니다. 당신이 조심하지 않으면이 쉽게 응용 프로그램에서 잘못된 반응이 많이 발생할 수 있습니다.

  4. ==============================

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

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

    MySQL은 COL_NAME에서 같은 최적화는 COL_NAME = constant_value에 사용할 수있는 IS NULL 수행 할 수있다. 예를 들어, MySQL은 IS NULL과 NULL을 검색 인덱스와 범위를 사용할 수 있습니다

  5. from https://stackoverflow.com/questions/229179/null-in-mysql-performance-storage by cc-by-sa and MIT license