NULL hay KHÔNG NULL theo mặc định?


41

Trong MySQL, tốt hơn là luôn luôn cho phép null trừ khi bạn biết một trường là bắt buộc hoặc luôn luôn sử dụng Not Nulltrừ khi bạn biết một trường sẽ chứa null? Hay nó không quan trọng?

Tôi biết trong một số DBMS họ nói rằng sử dụng Not Nullcàng nhiều càng tốt bởi vì cho phép null yêu cầu thêm một bit (hoặc byte?) Cho mỗi bản ghi để lưu trữ trạng thái Null.


1
Bạn nên cho phép NULLnếu và chỉ khi NULLgiá trị có một giải thích cho điều bạn đang lập mô hình.
jameshfisher

Câu trả lời:


25

Trong hầu hết các DB, một NOT NULLcột sẽ hiệu quả hơn về mặt dữ liệu được lưu trữ vì lý do bạn nêu và cũng hiệu quả hơn đối với truy vấn và lập chỉ mục - vì vậy trừ khi bạn muốn cho phép NULL trong một cột, bạn không nên cho phép chúng rõ ràng.

Sẽ có một hàm ý hiệu suất nhỏ, vì các NOT NULLràng buộc bổ sung sẽ có khả năng cần được kiểm tra cho mỗi hàng bạn ảnh hưởng với bất kỳ INSERT hoặc UPDATE nào, nhưng vì hầu hết các cơ sở dữ liệu đều nhẹ và tương đối nặng nên điều này có thể không phải là vấn đề đáng lo ngại dù sao thì thời gian thực hiện cũng khó có thể đáng chú ý vì đây là hoạt động gắn với CPU trong đó phần còn lại của hoạt động chèn / cập nhật sẽ bị ràng buộc IO và do đó, một cổ chai quan trọng hơn nhiều) và nó cung cấp cho bạn một số "miễn phí" "Kiểm tra dữ liệu để mã của bạn (hoặc mã của người khác) không thể vô tình đặt NULL trong đó mã khác không mong đợi chúng và do đó có thể cho kết quả không chính xác khi có mặt chúng.

Chỉnh sửa: Như Peter chỉ ra trong nhận xét của mình, ở trên là một khái quát và có thể không đúng với tất cả các DMBS, mặc dù tôi khá chắc chắn rằng nó làm được cho mysql và mssql. Các biến chứng khác trong khu vực có thể bao gồm các tính năng như các bảng thưa thớt (ví dụ như MSSQL 2008 đã triển khai) sẽ làm thay đổi động lực hiệu suất của các cột không (không).


8
Điều này không nhất thiết đúng trong PostgreSQL. Các cột không tiết kiệm không gian, có thể cải thiện tốc độ và thời gian xử lý nên giống nhau.
Peter Eisentraut

4
Điều này cũng không đúng với Oracle. Ngoài ra, không giống như MySql, Oracle không lập chỉ mục null để bạn có thể giảm kích thước chỉ mục của mình bằng cách sử dụng chúng. Xem stackoverflow.com/questions/289001/does-mysql-index-null-values
Leigh Riffel

8

Bạn nên để thiết kế lược đồ và các yêu cầu ứng dụng của bạn hướng dẫn quyết định này. Sự khác biệt hiệu suất có thể không đáng chú ý trong cả hai trường hợp.


3
Một lần nữa, cách tốt nhất để biết chắc chắn là hồ sơ và thử nghiệm.
jcolebrand

Tôi sẽ cẩn thận với các tuyên bố rộng như vậy - nếu bạn viết 10 triệu hàng một đêm vào một bảng thông qua quy trình ETL và bảng đó có một loạt các trường bị ràng buộc Không Null, bạn sẽ thấy các tác động hiệu suất.
ScottCher

1
+1: Có thể điều đó không đúng với tất cả các ứng dụng, nhưng đối với những gì tôi đang làm để có được dữ liệu nhất quán / chính xác thì quan trọng hơn là tiết kiệm một số dung lượng hoặc mất một số tốc độ.
jp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.