2013-09-26 59 views
7

Có sử dụng một kiểu dữ liệu smallint trong một bảng mysql trên một int thường xuyên thực sự cải thiện việc sử dụng bộ nhớ? Liệu phần cứng sẽ chỉ phân bổ kích thước từ 64 bit đầy đủ cho tất cả dữ liệu? Nếu nó không phân bổ một từ đầy đủ, thì chúng ta sẽ không thấy một hiệu suất giảm từ việc phải phân tích ra nhiều điểm nhỏ hoặc nhỏ từ một từ 64 bit được cấp phát trong bộ nhớ? Về cơ bản, có bất kỳ lợi ích thiết kế/bộ nhớ/hiệu suất nào khi sử dụng bảng sau trên bảng sau, giả sử chúng ta biết phạm vi giá trị được lưu trữ trong cột Status sẽ không bao giờ vượt quá phạm vi tối đa/min của smallint? Mọi thông tin chi tiết sẽ được đánh giá cao:Có sử dụng smallint datatype trên int trong mysql thực sự tiết kiệm bộ nhớ?

create table `TestTableWithSmallInt` (
    `ID` bigint(20) NOT NULL AUTO_INCREMENT, 
    `Status` smallint(11) DEFAULT 0, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

create table `TestTableWithInt` (
    `ID` bigint(20) NOT NULL AUTO_INCREMENT, 
    `Status` int(11) DEFAULT 0, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Trả lời

7

Bạn sẽ lưu về mặt lý thuyết hai byte mỗi hàng, một SMALLINT là số nguyên được ký 16 bit so với số INT được ký 32 bit. various types have varying storage requirements.

Thông thường, khoản tiết kiệm giữa INTSMALLINT sẽ tạo ra một cải tiến hiệu suất mỏng mà bạn sẽ gặp khó khăn khi đo, đặc biệt nếu có một số trường nhỏ bạn cắt theo cách này.

Ngược lại, bạn chỉ muốn sử dụng BIGINT khi có thể hiểu rằng bạn có thể làm cạn kiệt không gian số của trường được gắn cờ AUTO_INCREMENT.

Bạn có lẽ nên khai báo chúng theo kiểu trần của chúng, không có chiều dài, để phù hợp nhất. INT thích hợp hơn là INT(11)SMALLINT(11) là gây hiểu nhầm vì không thể có được độ chính xác nhiều từ giá trị 16 bit.

+0

Có thể đây là câu hỏi về phần cứng nhiều hơn? Sự hiểu biết của tôi về kiến ​​trúc 64 bit là ngay cả giá trị nhỏ nhất có thể vẫn sẽ chiếm một kích thước từ 64 bit. Nếu vậy, sẽ không một smallint vẫn sử dụng cùng một bit 64 bit của bộ nhớ như là một int? Vì vậy, có hiệu quả, tuyên bố một lĩnh vực như smallint sẽ chỉ áp đặt một giá trị tối đa trên lĩnh vực này, mà không thực sự tiết kiệm bất kỳ bộ nhớ? Cảm ơn lời khuyên về việc khai báo các loại trần bằng cách này :) – encrest

+1

Đó không phải là trường hợp. Có thể bạn đang nghĩ đến các vấn đề liên kết, nhưng giá trị 16 bit được [căn chỉnh trên ranh giới 4 byte] (http://software.intel.com/en-us/articles/data-alignment-when-migrating-to- 64-bit-intel-architecture) không 8. Tôi thực sự sẽ không lo lắng về điều này trừ khi bạn có thể đo lường dấu chân bộ nhớ của MySQL một cách có ý nghĩa, và tôi chưa bao giờ phải lo lắng về bản thân mình với mức độ chi tiết đó. Máy tính có bộ nhớ gigabyte, và có tối ưu hóa để đóng gói dữ liệu chặt chẽ hơn, nó hiếm khi là một mối quan tâm. – tadman

1

Việc truyền dữ liệu của các khối bộ nhớ nhỏ gọn nhanh hơn. Chỉ khi một ngôn ngữ lập trình được phát, chuyển đổi diễn ra.

Các vấn đề liên quan