programing

MySQL(퍼포먼스 및 스토리지)의 특수한 절차

shortcode 2022. 9. 13. 22:34
반응형

MySQL(퍼포먼스 및 스토리지)의 특수한 절차

MySQL에서 퍼포먼스와 스토리지(공간)에 적합한 null은 정확히 무엇입니까?

예를 들어 다음과 같습니다.

TINYINT: 1바이트 TINYINT, 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이 퍼포먼스에 미치는 영향에 대해 우려하는 것은 마이크로 최적화 영역입니다.투자 대비 효과가 더 큰 분야인 다른 곳에 집중해야 합니다.예를 들어 잘 선택된 인덱스를 추가하거나 데이터베이스 캐시 할당을 늘립니다.

빌의 대답은 좋지만 좀 구식이다.NULL 저장에 1~2바이트를 사용하는 것은 InnoDB REDUENT 행 형식에만 적용됩니다.MySQL 5.0.3 InnoDB는 NULL(물론 최소 1바이트)을 저장하기 위해 1비트만 사용하는 COMPACE 행 형식을 사용하기 때문에 다음과 같습니다.

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

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

MySQL 공식 사이트에 따르면 COMPCT vs Redundant:

콤팩트한 행 형식은 일부 작업에서 CPU 사용을 증가시키는 비용으로 행 스토리지 공간을 약 20% 줄입니다.워크로드가 캐시 적중률 및 디스크 속도에 의해 제한되는 일반적인 워크로드라면 콤팩트 포맷이 더 빠를 수 있습니다.

빈 문자열 또는 제로보다 NULLS를 사용하는 이점:

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

절감 효과는 다음과 같습니다.

  • 8개의 NULL에는 1바이트 필요
  • 8 빈 문자열은 8바이트 필요
  • 8 제로에는 32바이트 필요

한편 빈 문자열이나 0에는 NULL을 사용하는 것이 좋습니다.NULL은 보다 체계적이고 휴대성이 뛰어나며 공간도 적게 필요하기 때문입니다.성능을 향상시키고 공간을 절약하려면 이상한 속임수 대신 적절한 데이터 유형, 인덱스 및 쿼리를 사용하는 데 집중하십시오.

상세내용 : https://dev.mysql.com/doc/refman/5.7/en/innodb-physical-record.html

는 빌 카윈의 의견에 동의하지만, MySQL의 힌트를 추가하고 싶습니다.11번에서는 특히 다음과 같은 사항을 다루고 있습니다.

우선 빈 문자열 값과 NULL 값(INT 필드의 경우 0 vs) 사이에 차이가 있는지 자문해 보십시오.NULL). 둘 다 가질 필요가 없는 경우 NULL 필드가 필요하지 않습니다(Oracle에서는 NULL과 빈 문자열이 동일한 것으로 간주하고 있다는 것을 알고 계십니까?

NULL 열에는 추가 공간이 필요하며 비교 문장이 복잡해질 수 있습니다.될 수 있을 때 피하세요.그러나 NULL 값을 가져야 하는 매우 구체적인 이유가 있는 사람도 있다는 것을 알고 있습니다.이것은 항상 나쁜 것은 아닙니다.

한편, 나는 NOT NULL이라고 말하는 논리를 좋아하기 때문에 많은 행이 없는 테이블에서는 여전히 NULL을 사용한다.

업데이트 나중에 다시 한 번 말씀드리면 개인적으로 데이터베이스에서 NULL 대신 0을 사용하는 것을 좋아하지 않으며 권장하지 않습니다.주의하지 않으면 응용 프로그램에서 많은 잘못된 긍정이 발생할 수 있습니다.

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

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

언급URL : https://stackoverflow.com/questions/229179/null-in-mysql-performance-storage

반응형