2009-01-25 88 views
45

我不知道在使用UNSIGNED標誌定義MySQL中的某個整數字段方面是否有任何積極影響?它使查詢更快還是數據庫更小?或者,如果我擔心上限,我是否應該打擾呢?在MySQL中籤名或未簽名

回答

53

根據MySQL的5.1手冊section 10.2

在非嚴格模式中,當一個 外的範圍值被分配給一個 整數列,MySQL的存儲表示值 相應 列數據類型的端點 範圍。如果將256存儲到TINYINT 或TINYINT UNSIGNED列中,則MySQL 將分別存儲127或255。當 浮點或定點柱 分配超出 範圍由指定的(或默認 )精度和標度暗示的值時,MySQL 存儲表示該範圍的 對應的端點的值。

所以使用UNSIGNED只有當你關心上限時纔是必要的。另外添加UNSIGNED不會影響列的大小,只是數字是如何編號爲represented

+6

此外,對於只存儲無符號值的情況,索引的性能會有所提高。就像@ kevin-loney所說,它可以節省索引上限值的時間。請參閱[我寫的文章](http://rakesh.sankar-b.com/2010/08/25/mysql-unsigned-int-to-signed-int-performance-tips-index/)關於使用無符號類型在簽名。 – 2012-07-10 11:58:24

9

當列僅用於包含正數時使用無符號數。

它不會影響列上的任何I/O性能,因爲它仍然佔用完全相同的空間量。

21

這並不重要,除非你試圖讓你的價值最大化並且不需要負值。

例如,假設您想存儲0-255。

你可以使用tinyint,但前提是你將它用作unsigned。

很多我見過的數據庫,人們並不打擾這樣優化,最後得到一些相當大的表,因爲他們一直使用INT。

不過,如果你在談論int vs unsigned int,那麼根本沒有性能影響或空間效應。

從標準的角度來看,我總是使用無符號的,只有當我知道我需要負值時才使用符號。

17

說到性能或存儲,這絕對是一回事。

作爲一個通用規則,使用適合您的更適合的方式:如果您只需要正值,則將值存儲爲UNSIGNED,否則,將其設置爲默認值[SIGNED]。

當爲PRIMARY AUTOINCREMENT列設置SIGNED值時會出現一個問題:自動生成的數字的計數以1開頭(不是最小的負數)並且可能的值將提前結束,因爲您將僅使用價值的一半。所以在這種情況下(PRIMARY + AUTOINCREMENT列)最好存儲爲UNSIGNED。

4

它會提高性能,假設您想要搜索數量< 50o。

沒有「無符號」: 過程流程,由於數量字段是一個「int」,並且你有這個字段的索引,所以MySQL將定義範圍爲-2147483648到500,它將得到基於此的結果範圍。由於數量字段是一個帶有「無符號」的「int」,並且你有這個字段的索引,所以MySQL將把該範圍定義爲0到500,並且它將得到結果基於這個範圍。

3

在這裏你可以看到MySQL documentation的簽署與UNSIGNED INT的範圍。您會很快注意到UNSIGNED INT的樓層始終爲0,因此它永遠不會是負面的。

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