기본적으로 NULL 또는 NOT NULL?


41

MySQL에서는 필드가 필요하다는 것을 알지 못하는 한 항상 null을 허용하는 것이 좋습니까, 아니면 Not Null필드에 null이 포함될 것을 알지 않는 한 항상 사용하는 것이 더 낫 습니까? 아니면 상관 없어?

일부 DBMS에서는 Not Nullnull을 허용하면 Null 상태를 저장하기 위해 레코드 당 추가 비트 (또는 바이트?)가 필요하기 때문에 가능한 한 많이 사용한다고 말합니다 .


1
값이 모델링하는 것에 대한 해석이있는 NULL경우에만 허용해야합니다 NULL.
jameshfisher

답변:


25

대부분의 DB에서 NOT NULL열은 사용자가 언급 한 이유로 저장된 데이터 측면에서보다 효율적이며 쿼리 및 색인화에 더 효율적입니다. 따라서 열에 NULL을 허용하지 않으면 명시 적으로 허용하지 않아야합니다.

NOT NULLINSERT 또는 UPDATE로 영향을받는 각 행에 대해 추가 제약 조건을 잠재적으로 확인해야 하므로 성능에 약간의 영향이 있지만 대부분의 데이터베이스는 상대적으로 쓰기가 적고 읽기가 많기 때문에 문제가되지 않습니다. 나머지 삽입 / 업데이트 작업이 IO 바운드되어 훨씬 더 중요한 병목 현상이 발생하는 CPU 바운드 작업이므로 추가 시간이 전혀 눈에 띄지 않을 것입니다. "데이터 검사를 통해 코드 (또는 다른 사람의 코드)가 실수로 다른 코드가 예상하지 않는 위치에 NULL을 넣을 수 없으므로 존재 여부에 따라 잘못된 결과가 발생할 수 있습니다.

편집 : Peter가 자신의 의견에서 지적한 것처럼 위의 내용은 일반주의이며 모든 DMBS에 적용되지는 않지만 mysql 및 mssql에 대해서는 확실합니다. 이 영역의 다른 복잡한 문제에는 스파 스 테이블 (예 : MSSQL 2008 구현)과 같은 기능이 포함되어 Null을 허용하지 않는 열의 성능 역학이 변경 될 수 있습니다.


8
PostgreSQL에서는 반드시 그런 것은 아닙니다. 널 (null) 열은 공간을 절약하여 속도를 향상시킬 수 있으며 처리 시간은 거의 같습니다.
Peter Eisentraut

4
이것은 Oracle에도 해당되지 않습니다. 또한 MySql과 달리 Oracle은 널 색인을 작성하지 않으므로이를 사용하여 색인 크기를 줄일 수 있습니다. stackoverflow.com/questions/289001/does-mysql-index-null-values를
Leigh Riffel

8

스키마 디자인 및 응용 프로그램 요구 사항이이 결정을 안내하도록해야합니다. 대부분의 경우 성능 차이가 눈에 띄지 않을 수 있습니다.


3
다시 한 번 확실하게 알 수있는 가장 좋은 방법은 프로파일 링 및 테스트입니다.
jcolebrand

ETL 프로세스를 통해 하룻밤 동안 천만 행을 테이블에 쓰고 테이블에 Null이 아닌 제한 필드가있는 경우 성능에 영향을 미칩니다.
ScottCher

1
+1 : 모든 응용 프로그램에 해당되는 것은 아니지만 공간을 절약하거나 속도를 잃는 것보다 일관된 / 정확한 데이터를 얻는 것이 더 중요합니다.
jp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.