2009-01-25 38 views
45

Tôi tự hỏi có hiệu ứng tích cực nào khi sử dụng cờ UNSIGNED khi xác định một số trường số nguyên trong MySQL không? Liệu nó làm cho các truy vấn nhanh hơn hoặc cơ sở dữ liệu nhỏ hơn? Hay tôi chỉ nên bận tâm với nó nếu tôi lo ngại về giới hạn trên?Đã ký hoặc chưa được ký trong MySQL

Trả lời

53

Theo section 10.2 của MySQL 5.1 Manual:

Trong chế độ không nghiêm ngặt, khi một out-of-phạm vi giá trị được gán cho một cột số nguyên, MySQL lưu trữ các giá trị đại diện tương ứng điểm cuối của kiểu dữ liệu cột phạm vi. Nếu bạn lưu trữ 256 vào cột TINYINT hoặc TINYINT UNSIGNED, thì MySQL lưu trữ 127 hoặc 255, tương ứng. Khi cột dấu phẩy động hoặc điểm cố định được chỉ định giá trị vượt quá phạm vi được xác định bởi độ chính xác (hoặc mặc định) được chỉ định, MySQL lưu giá trị đại diện cho điểm cuối tương ứng của dải đó.

Vì vậy, việc sử dụng UNSIGNED thực sự chỉ cần thiết khi bạn quan tâm đến giới hạn trên. Ngoài ra, thêm UNSIGNED không ảnh hưởng đến kích thước của cột chỉ cách số là represented.

+6

Ngoài ra, có cải thiện hiệu suất liên quan đến chỉ mục cho những trường hợp bạn chỉ lưu trữ giá trị chưa ký. Giống như @ kevin-loney cho biết, nó có thể tiết kiệm thời gian lập chỉ mục các giá trị giới hạn trên. Vui lòng xem [bài viết mà tôi đã viết] (http://rakesh.sankar-b.com/2010/08/25/mysql-unsigned-int-to-signed-int-performance-tips-index/) về cách sử dụng loại chưa ký trên đã ký. –

+2

BẠN LÀ KING, KING, BRO! Bạn vừa cứu tôi rất nhiều bộ não ... bằng cách quản lý ở trên. :-) Cảm ơn bạn! –

9

Sử dụng unsigned khi cột chỉ có nghĩa là chứa số dương.

Nó sẽ không ảnh hưởng đến bất kỳ hiệu suất I/O nào trên cột, vì nó vẫn sẽ chiếm cùng một lượng không gian.

21

Nó không quan trọng trừ khi bạn đang cố gắng để có được hầu hết các bang cho buck của bạn ra khỏi các giá trị và không cần giá trị âm.

Ví dụ: giả sử bạn muốn lưu trữ 0-255.

Bạn có thể sử dụng một tinyint nhưng chỉ khi bạn sử dụng nó như unsigned.

Rất nhiều cơ sở dữ liệu tôi đã thấy, mọi người không bận tâm tối ưu hóa như thế này và kết thúc với một số bảng khá lớn vì họ chỉ sử dụng INT mọi lúc.

Tuy nhiên, nếu bạn đang nói về int vs unsigned int, không có ảnh hưởng hiệu suất hoặc hiệu ứng không gian nào cả.

Từ quan điểm tiêu chuẩn, tôi luôn sử dụng dấu chưa ký và chỉ sử dụng được ký khi tôi biết mình sẽ cần giá trị âm.

17

Khi nói đến hiệu suất hoặc lưu trữ, nó hoàn toàn giống nhau.

Như một quy tắc chung, hãy sử dụng bất kỳ điều gì phù hợp hơn với bạn: nếu bạn chỉ cần giá trị dương, lưu trữ các giá trị như UNSIGNED, nếu không, hãy để nó là [SIGNED] mặc định.

Một vấn đề phát sinh khi giá trị SIGNED được đặt cho cột TỰ ĐỘNG CHÍNH: việc đếm các số được tạo tự động bắt đầu bằng 1 (không phải là số âm nhỏ nhất) và giá trị có thể sẽ kết thúc sớm hơn, vì bạn sẽ chỉ sử dụng một nửa giá trị. Vì vậy, trong trường hợp này (PRIMARY + AUTOINCREMENT cột) nó là tốt hơn để lưu trữ như UNSIGNED.

4

Nó sẽ cải thiện peroformance, cho phép giả sử nếu bạn muốn tìm kiếm số lượng < 50o.

Nếu không có "unsigned": Quy trình, vì trường số lượng là "int" và bạn có chỉ mục của trường này, MySQL sẽ xác định dải ô là -2147483648 đến 500 và sẽ nhận được kết quả dựa trên điều này phạm vi.

Với “unsigned”: Quá trình xử lý, vì trường số lượng là “int” với “unsigned” và bạn có chỉ mục của trường này, MySQL sẽ xác định phạm vi từ 0 đến 500 và sẽ nhận được kết quả dựa trên phạm vi này.

1

Cảnh báo, có vấn đề với Unsigned Int (UINT) và Entity Framework hoặc ADO.NET. Nó có thể liên quan đến một vấn đề hội nhập của MySQL Connector phiên bản 6.

Theo kinh nghiệm của tôi, UInt được đọc như Long bởi EF, mà có thể gây một số vấn đề chính xác, vì UInt không phải là Long. Nó có thể gây đau đầu với bất kỳ ai không quen với vấn đề này.

mối quan tâm khác:

Integration problem between EF and Mysql Connector 6

DBContext cannot use UINT

EF provider trouble with UINT

3

Ở đây bạn sẽ nhìn thấy MySQL documentation cho dãy KÝ vs UNSIGNED INTs. Bạn sẽ nhanh chóng nhận thấy rằng sàn cho một UNSIGNED INT luôn luôn là 0, do đó nó không bao giờ có thể là tiêu cực.

Type Storage Minimum Value Maximum Value 
     (Bytes) (Signed/Unsigned) (Signed/Unsigned) 
TINYINT  1 -128   127 
       0    255 
SMALLINT 2 -32768   32767 
       0    65535 
MEDIUMINT 3 -8388608  8388607 
       0    16777215 
INT   4 -2147483648  2147483647 
       0    4294967295 
BIGINT  8 -9223372036854775808 9223372036854775807 
       0    18446744073709551615 
Các vấn đề liên quan