InnoDB lưu trữ MEDIUMINT dưới dạng giá trị ba byte, nhưng khi MySQL phải thực hiện bất kỳ tính toán nào, ba byte MEDIUMINT được chuyển đổi thành tám byte int dài không dấu (tôi cho rằng ngày nay không ai chạy MySQL trên 32 bit).
Có những ưu và khuyết điểm, nhưng bạn hiểu rằng lập luận "Thật ngu ngốc và chậm và mã triển khai nó thật kinh dị" không phải là kỹ thuật, phải không?
Tôi sẽ nói MEDIUMINT có ý nghĩa khi kích thước dữ liệu trên đĩa là rất quan trọng. I E. khi một bảng có quá nhiều bản ghi mà ngay cả một byte chênh lệch (4 byte INT so với 3 byte MEDIUMINT) cũng có ý nghĩa rất lớn. Đó là một trường hợp khá hiếm, nhưng có thể.
mach_read_from_3 và mach_read_from_4 - nguyên thủy mà InnoDB sử dụng để đọc số từ bản ghi InnoDB cũng tương tự. Cả hai đều trả về ulint. Tôi cá là bạn sẽ không nhận thấy sự khác biệt về bất kỳ khối lượng công việc.
Chỉ cần xem mã:
ulint
mach_read_from_3(
/*=============*/
const byte* b) /*!< in: pointer to 3 bytes */
{
ut_ad(b);
return( ((ulint)(b[0]) << 16)
| ((ulint)(b[1]) << 8)
| (ulint)(b[2])
);
}
Bạn có nghĩ rằng nó chậm hơn nhiều so với mức này không?
ulint
mach_read_from_4(
/*=============*/
const byte* b) /*!< in: pointer to four bytes */
{
ut_ad(b);
return( ((ulint)(b[0]) << 24)
| ((ulint)(b[1]) << 16)
| ((ulint)(b[2]) << 8)
| (ulint)(b[3])
);
}