Trong MySQL, khi bạn khai báo một cột với kiểu dữ liệu INT(10) thay vì INT(1), thực chất không có sự khác biệt về mặt hiệu suất hoặc cách dữ liệu được lưu trữ trong cơ sở dữ liệu. Hãy giải thích chi tiết để bạn hiểu rõ hơn:
1. Ý nghĩa của INT(n)
- Trong MySQL, INT là một kiểu dữ liệu số nguyên 4 byte (32-bit), có khả năng lưu trữ giá trị từ -2,147,483,648 đến 2,147,483,647 (đối với signed) hoặc 0 đến 4,294,967,295 (đối với unsigned).
- Số trong ngoặc như INT(10) hoặc INT(1) không phải là giới hạn độ dài của giá trị được lưu trữ. Nó chỉ định độ rộng hiển thị (display width) khi bạn sử dụng công cụ như MySQL CLI với tùy chọn ZEROFILL. Nếu không dùng ZEROFILL, con số này gần như không có ý nghĩa thực tế trong việc lưu trữ hay xử lý dữ liệu.
Ví dụ:
CREATE TABLE test ( col1 INT(1), col2 INT(10) ); INSERT INTO test (col1, col2) VALUES (12345, 12345);- Cả col1 và col2 đều lưu được giá trị 12345 mà không bị cắt xén.
- Nếu thêm ZEROFILL:
- col1 INT(1) ZEROFILL sẽ hiển thị là 0.
- col2 INT(10) ZEROFILL sẽ hiển thị là 0000012345.
2. Hiệu suất (Performance)
- Không có sự khác biệt về hiệu suất giữa INT(1) và INT(10). Vì sao? Vì cả hai đều sử dụng đúng 4 byte bộ nhớ để lưu trữ giá trị, bất kể số trong ngoặc là bao nhiêu. MySQL không thay đổi kích thước vật lý của kiểu dữ liệu dựa trên độ rộng hiển thị.
- Hiệu suất chỉ thay đổi nếu bạn chọn kiểu dữ liệu nhỏ hơn thực sự như TINYINT (1 byte), SMALLINT (2 byte), hoặc BIGINT (8 byte), vì những kiểu này ảnh hưởng trực tiếp đến dung lượng lưu trữ và tốc độ xử lý trong một số trường hợp.
3. Khi nào nên quan tâm?
- Nếu bạn cần tiết kiệm dung lượng lưu trữ (ví dụ trong bảng có hàng triệu bản ghi), hãy chọn kiểu dữ liệu phù hợp với phạm vi giá trị thực tế:
- TINYINT: -128 đến 127 (hoặc 0 đến 255 nếu unsigned).
- SMALLINT: -32,768 đến 32,767.
- INT: Như đã đề cập ở trên.
- Còn nếu chỉ thay đổi từ INT(1) sang INT(10), thì không có tác động gì đến hiệu suất hay dung lượng.
Kết luận
Khai báo INT(10) thay vì INT(1) chỉ ảnh hưởng đến cách hiển thị (nếu dùng ZEROFILL), nhưng không thay đổi cách dữ liệu được lưu trữ hay hiệu suất hoạt động của MySQL. Nếu bạn không dùng ZEROFILL, thì số trong ngoặc gần như chỉ mang tính "trang trí" và không cần quá bận tâm.