MySQL數據類型的最優選擇 慎重選擇數據類型很重要、為啥哩?可以提高性能、原理如下: ● 存儲(內存、磁盤)、從而節省I/O(檢索相同數據情況下) ● 計算、進而減負CPU負載 數據類型總體可分三種:數字、字符和時期 ㈠ 數字 ① 分類 ② 為整數類型指定寬度沒啥意義、硬說呢、大概也是為了顯示字符的個數、人性化點 因為、對於存儲和計算而言、INT(1)和INT(100)是相同的 ③ 對於浮點、建議只指定數據類型、而不要指定精度 ④ 對於定點、盡量只在對小數精確計算時才使用、如存儲財務數據 但天朝某些財務軟件在其數據庫內使用float作為工資類型 赤裸裸的資本家的丑惡展現、鄙視!!! ⑤ 在數據量較大時、建議把實數類型轉為整數類型 原因很簡單: ● 浮點不精確 ● 定點計算代價昂貴 例如: 要存放財務數據精確到萬分之一、則可以把所有金額乘以一百萬、然後存在BIGINT下 ㈡ 字符串 ① 分類 ② 數據如何存儲取決於存儲引擎 char和varchar在不同引擎在內存和磁盤可能是不一樣的 不過、對於char、在填充和截取上是一樣的、因為、 這部分是在Server層完成的 ③ 常見 char 使用場景 ● 很短的字符串或所有值都接近同一個長度、如存儲密碼的MD5值 ● 經常變更的列、因為char產生的碎片少 ● 非常短的列、如性別、char(1)的效率更好、畢竟varchar(1)浪費了1一個字節 ④ 和字符集的那點貓膩 CSDN 有個討論非常熱的帖子:有人認為unicode跟utf-8是等同的嗎? 點擊看討論貼 我趕腳、這其實沒啥好討論的、因為、這兩個根本就是兩回事 Unicode 是字符編碼 utf8 是字符集 對Unicode編碼的字符集、牆裂建議使用varchar 顯然、utf8 也是Unicode 編碼的、而且、隨著國際化趨勢、utf8 是首選 那麼、結果是、在char 和 varchar 競爭裡、varchar 便是最大贏家 可通過下列方法查看MySQL Unicode支持的字符集以及當前的字符集 [plain] mysql> select CHARACTER_SET_NAME from character_sets -> where DESCRIPTION like '%Unicode%'\G; *************************** 1. row *************************** CHARACTER_SET_NAME: utf8 *************************** 2. row *************************** CHARACTER_SET_NAME: ucs2 *************************** 3. row *************************** CHARACTER_SET_NAME: utf8mb4 *************************** 4. row *************************** CHARACTER_SET_NAME: utf16 *************************** 5. row *************************** CHARACTER_SET_NAME: utf32 5 rows in set (0.06 sec) mysql> status; -------------- mysql Ver 14.14 Distrib 5.5.16, for Linux (i686) using EditLine wrapper Connection id: 1 Current database: information_schema Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.5.16-log Source distribution Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: latin1 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /tmp/mysql.sock Uptime: 2 min 9 sec ⑤ 對於InnoDB 建議使用varchar 現在很多場合都使用了InnoDB、算下來、varchar 又贏了 ⑥ 存儲大數據 ● BLOB:采用二進制存儲、沒有字符集或排序規則 ● TEXT:采用字符方式存儲、有字符集和排序規則 最好盡量避免使用這兩、如果可以、可以把BLOB貨TEXT 列分離成單獨的表 對於使用了BLOB或TEXT大量刪除或更新時、 建議定期使用 optimize table 碎片整理 ㈢ 日期和時間類型 常見的有 datatime、timestamp 和 date 從存儲上看、timestamp 占 4 個字節、其他兩個 8 個字節 所以、若無意外、最好盡量使用 timestamp 、即使它比較調皮、例如和時區相關