Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL:NULL vs

Đối với bảng MyISAM, NULL tạo thêm một bit cho mỗi cột NULLABLE (bit rỗng) cho mỗi hàng. Nếu cột không phải là NULLABLE, thì không bao giờ cần thêm bit thông tin. Tuy nhiên, điều đó được đệm ra 8 byte bit để bạn luôn đạt được 1 + mod 8 byte cho số lượng cột NULLABLE. 1

Các cột văn bản hơi khác một chút so với các kiểu dữ liệu khác. Đầu tiên, đối với "", mục nhập bảng chứa độ dài hai byte của chuỗi theo sau là byte của chuỗi và là một cấu trúc độ dài biến thể. Trong trường hợp NULL, không cần thông tin về độ dài nhưng nó luôn được bao gồm như một phần của cấu trúc cột.

Trong InnoDB, NULLS không chiếm dung lượng:Đơn giản là chúng không tồn tại trong tập dữ liệu. Điều này cũng đúng với chuỗi trống vì các phần bù dữ liệu cũng không tồn tại. Sự khác biệt duy nhất là các NULL sẽ có bit NULL được đặt trong khi các chuỗi rỗng thì không. 2

Khi dữ liệu thực sự được bố trí trên đĩa, NULL và '' chiếm CHÍNH XÁC CÙNG KHÔNG GIAN TRONG cả hai kiểu dữ liệu. Tuy nhiên, khi giá trị được tìm kiếm, việc kiểm tra NULL nhanh hơn một chút sau đó kiểm tra '' vì bạn không phải xem xét độ dài dữ liệu trong tính toán của mình:bạn chỉ kiểm tra bit null.

Do sự khác biệt về khoảng trắng NULL và '', NULL '' KHÔNG CÓ TÁC ĐỘNG CỦA KÍCH THƯỚC trừ khi cột được chỉ định là NULLable hoặc không. Nếu cột KHÔNG NULL, thì chỉ trong bảng MyISAM, bạn mới thấy bất kỳ sự khác biệt nào về hiệu suất (và sau đó, rõ ràng, không thể sử dụng NULL mặc định nên đây là một câu hỏi tranh luận).

Câu hỏi thực sự sau đó chuyển sang phần giải thích ứng dụng của các cột "không có giá trị nào được đặt ở đây". Nếu "" là một giá trị hợp lệ có nghĩa là "người dùng không nhập gì ở đây" hoặc như vậy, thì NULL mặc định sẽ thích hợp hơn khi bạn muốn phân biệt giữa NULL và "" khi một bản ghi được nhập mà không có dữ liệu trong đó.

Nói chung, mặc định chỉ thực sự hữu ích để cấu trúc lại cơ sở dữ liệu, khi các giá trị mới cần có hiệu lực trên dữ liệu cũ. Trong trường hợp đó, một lần nữa, sự lựa chọn phụ thuộc vào cách dữ liệu ứng dụng được diễn giải. Đối với một số dữ liệu cũ, NULL là hoàn toàn thích hợp và phù hợp nhất (cột không tồn tại trước đây nên bây giờ nó có giá trị NULL!). Đối với những người khác, "" thích hợp hơn (thường khi truy vấn sử dụng SELECT * và NULL gây ra sự cố).

Trong ĐIỀU KHOẢN SIÊU-CHUNG (và từ quan điểm triết học) mặc định NULL cho cột NULLABLE được ưu tiên vì nó cung cấp cách giải thích ngữ nghĩa tốt nhất cho "Không có giá trị được chỉ định".

1 [ http://forge.mysql.com/wiki/MySQL_Internals_MyISAM]

2 [ http://forge.mysql.com/wiki/MySQL_Internals_InnoDB]



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Di chuyển Cơ sở dữ liệu MySQL từ CloudSQL sang AWS RDS

  2. Bật ghi nhật ký truy vấn chậm (Nhật ký truy vấn chậm) trong Cơ sở dữ liệu MySQL

  3. Phần còn lại trong PostgreSQL, MS SQL Server, MySQL và SQLite

  4. Không thể xóa hoặc cập nhật hàng mẹ:ràng buộc khóa ngoại không thành công

  5. Hợp nhất hai bảng với số cột khác nhau