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
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.
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.
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.
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.
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.
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:
Ở đâ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
- 1. Loại int mặc định: Đã ký hoặc Chưa ký?
- 2. Có phải C++ enums đã ký hoặc chưa ký?
- 3. Giá trị đã ký và chưa ký nghĩa là gì?
- 4. Ký hợp đồng chưa được ký
- 5. Chỉ số đã ký với số tử chưa ký
- 6. BOOL và tinyint (1) ... chưa được ký?
- 7. Sự khác biệt của Android giữa các tệp .apk đã ký và chưa được ký?
- 8. Từ khóa chưa được ký trong C++
- 9. FactoryGirl, tại sao tôi đã đăng ký hoặc chưa được khởi tạo?
- 10. Đã xác định tràn cho VHDL numeric_std đã ký/chưa ký
- 11. Kiểu mặc định của hằng số nguyên được ký hoặc chưa ký?
- 12. Chuyển đổi ký tự chưa ký thành số nguyên đã ký
- 13. Cách máy tính phân biệt một số nguyên được ký hoặc chưa ký?
- 14. Làm cách nào để kiểm tra xem ký tự thuần túy có được ký hoặc chưa ký?
- 15. IllegalArgumentException: Dịch vụ chưa được đăng ký:
- 16. Nguyên thủy âm chưa được ký?
- 17. Câu hỏi của Char C về mã hóa đã ký/chưa ký
- 18. Làm cách nào để thực hiện phân chia số nguyên (đã ký hoặc chưa ký) trên ARM?
- 19. Ký tự hoặc ký tự không ký hiệu là char32_t`?
- 20. Số chưa ký và số đã ký dưới dạng chỉ mục
- 21. Số nguyên chưa được ký trong C++ cho vòng
- 22. Tại sao Java cho tôi biết applet của tôi chứa cả mã đã ký và chưa ký?
- 23. Ký tự đại diện chưa được gửi trong Java
- 24. Nhà máy chưa đăng ký
- 25. 'Nhiệt độ chưa được ký: 3' trong cấu trúc hoặc công đoàn nghĩa là gì?
- 26. Cách xác định xem nhà cung cấp VFPOLEDB đã được cài đặt/đăng ký chưa?
- 27. Kiểm tra xem bộ chuyển đổi đã được đăng ký chưa
- 28. cách in hex đã ký trong c
- 29. lỗi: id đã được đăng ký
- 30. "Observer ... đã không được đăng ký" lỗi
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ý. –
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! –