Tôi sẽ rất kén chọn từ ngữ trong giây lát:
- Ngay cả khi đó là một yếu tố hiệu suất quan trọng, điều đó không làm cho nó trở nên về mặt ngữ nghĩa đúng để sử dụng một giá trị thay vì NULL. Trong SQL, NULL có một vai trò ngữ nghĩa, để biểu thị một giá trị bị thiếu hoặc không thể áp dụng. Các đặc tính hiệu suất của NULL trong một triển khai RDBMS nhất định là độc lập với điều này. Hiệu suất có thể khác nhau giữa các thương hiệu hoặc giữa các phiên bản, nhưng mục đích của NULL trong ngôn ngữ là nhất quán.
Trong mọi trường hợp, tôi chưa nghe thấy bất kỳ bằng chứng nào cho thấy NULL hoạt động kém hiệu quả. Tôi muốn quan tâm đến bất kỳ tham chiếu nào đến các phép đo hiệu suất cho thấy các cột có thể làm trống hoạt động kém hơn các cột không thể null.
Tôi không nói rằng tôi không sai hoặc nó không thể đúng trong một số trường hợp - chỉ là việc đưa ra những giả thuyết vu vơ là không có ý nghĩa. Khoa học không được tạo thành từ phỏng đoán; người ta phải đưa ra bằng chứng với các phép đo có thể lặp lại.
Các chỉ số cũng cho bạn biết bao nhiêu hiệu suất khác nhau, vì vậy bạn có thể đưa ra đánh giá về việc liệu đó có phải là điều đáng lo ngại hay không. Có nghĩa là, tác động có thể đo lường được và khác không, nhưng vẫn không đáng kể so với các yếu tố hiệu suất lớn hơn, chẳng hạn như lập chỉ mục bảng đúng cách hoặc định cỡ bộ nhớ cache cơ sở dữ liệu của bạn.
Trong MySQL, các tìm kiếm NULL có thể được hưởng lợi từ một chỉ mục:
mysql> CREATE TABLE foo (
i INT NOT NULL,
j INT DEFAULT NULL,
PRIMARY KEY (i),
UNIQUE KEY j_index (j)
);
mysql> INSERT INTO foo (i, j) VALUES
(1, 1), (2, 2), (3, NULL), (4, NULL), (5, 5);
mysql> EXPLAIN SELECT * FROM foo WHERE i = 3;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | foo | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
mysql> EXPLAIN SELECT * FROM foo WHERE j IS NULL;
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
| 1 | SIMPLE | foo | ref | j_index | j_index | 5 | const | 2 | Using where |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
Lưu ý rằng đó vẫn không phải là một phép đo hiệu suất. Tôi chỉ cho thấy rằng bạn có thể sử dụng một chỉ mục trong khi tìm kiếm NULL. Tôi sẽ khẳng định (thừa nhận là chưa đo lường, nhưng đây chỉ là StackOverflow) rằng lợi ích của một chỉ mục làm lu mờ mọi hình phạt có thể xảy ra khi tìm kiếm NULL so với một chuỗi trống.
Việc chọn 0 hoặc trống hoặc bất kỳ giá trị nào khác để thay thế cho NULL không phải là một quyết định thiết kế chính xác. Bạn có thể cần phải sử dụng những giá trị quan trọng trong cột. Đó là lý do tại sao NULL tồn tại, như một giá trị theo định nghĩa nằm ngoài miền giá trị của bất kỳ kiểu dữ liệu nào, vì vậy bạn có thể sử dụng toàn bộ phạm vi giá trị của số nguyên hoặc chuỗi hoặc bất kỳ thứ gì và vẫn có điều gì đó để biểu thị "không có giá trị nào ở trên. "