阿里巴巴Mysql规范
MySQL數據類型選擇
在MySQL中,選擇正確的數據類型,對于性能至關重要。一般應該遵循下面兩步:
(1)確定合適的大類型:數字、字符串、時間、二進制;
(2)確定具體的類型:有無符號、取值范圍、變長定長等。
在MySQL數據類型設置方面,盡量用更小的數據類型,因為它們通常有更好的性能,花費更少的硬件資源。并且,盡量 把字段定義為NOT NULL,避免使用NULL。
1、數值類型
優化建議
- 如果整形數據沒有負數,如ID號,建議指定為UNSIGNED無符號類型,容量可以擴大一倍。
- 建議使用TINYINT代替ENUM、BITENUM、SET。
- 避免使用整數的顯示寬度(參看文檔最后),也就是說,不要用INT(10)類似的方法指定字段顯示寬度,直接用 INT。
- DECIMAL最適合保存準確度要求高,而且用于計算的數據,比如價格。但是在使用DECIMAL類型的時候,注意 長度設置。
- 建議使用整形類型來運算和存儲實數,方法是,實數乘以相應的倍數后再操作。
- 整數通常是最佳的數據類型,因為它速度快,并且能使用AUTO_INCREMENT。
2、日期和時間
優化建議
- MySQL能存儲的最小時間粒度為秒。
- 建議用DATE數據類型來保存日期。MySQL中默認的日期格式是yyyy-mm-dd。
- . 用MySQL的內建類型DATE、TIME、DATETIME來存儲時間,而不是使用字符串。
- 當數據格式為TIMESTAMP和DATETIME時,可以用CURRENT_TIMESTAMP作為默認(MySQL5.6以后), MySQL會自動返回記錄插入的確切時間。
- TIMESTAMP是UTC時間戳,與時區相關。
- DATETIME的存儲格式是一個YYYYMMDD HH:MM:SS的整數,與時區無關,你存了什么,讀出來就是什么。
- 除非有特殊需求,一般的公司建議使用TIMESTAMP,它比DATETIME更節約空間,但是像阿里這樣的公司一般 會用DATETIME,因為不用考慮TIMESTAMP將來的時間上限問題。
- 有時人們把Unix的時間戳保存為整數值,但是這通常沒有任何好處,這種格式處理起來不太方便,我們并不推薦 它。
3、字符串
優化建議
- 字符串的長度相差較大用VARCHAR;字符串短,且所有值都接近一個長度用CHAR。
- CHAR和VARCHAR適用于包括人名、郵政編碼、電話號碼和不超過255個字符長度的任意字母數字組合。那些 要用來計算的數字不要用VARCHAR類型保存,因為可能會導致一些與計算相關的問題。換句話說,可能影響到計 算的準確性和完整性。
- 盡量少用BLOB和TEXT,如果實在要用可以考慮將BLOB和TEXT字段單獨存一張表,用id關聯。
- BLOB系列存儲二進制字符串,與字符集無關。TEXT系列存儲非二進制字符串,與字符集相關。
- BLOB和TEXT都不能有默認值。
PS:INT顯示寬度
我們經常會使用命令來創建數據表,而且同時會指定一個長度,如下。但是,這里的長度并非是TINYINT類型存儲的最大長度,而是顯示的最大長度。
這里表示user表的id字段的類型是TINYINT,可以存儲的最大數值是255。所以,在存儲數據時,如果存入值小于等于 255,如200,雖然超過2位,但是沒有超出TINYINT類型長度,所以可以正常保存;如果存入值大于255,如500,那么 MySQL會自動保存為TINYINT類型的最大值255。
在查詢數據時,不管查詢結果為何值,都按實際輸出。這里TINYINT(2)中2的作用就是,當需要在查詢結果前填充0時, 命令中加上ZEROFILL就可以實現,如:
這樣,查詢結果如果是5,那輸出就是05。如果指定TINYINT(5),那輸出就是00005,其實實際存儲的值還是5,而且存 儲的數據不會超過255,只是MySQL輸出數據時在前面填充了0。
換句話說,在MySQL命令中,字段的類型長度TINYINT(2)、INT(11)不會影響數據的插入,只會在使用ZEROFILL時有 用,讓查詢結果前填充0。
總結
以上是生活随笔為你收集整理的阿里巴巴Mysql规范的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多个vmdk合并成一个vmdk方法
- 下一篇: 上兴远控原理疑问