謹慎選擇資料類型很重要、為啥哩?可以提高效能、原理如下:
● 儲存(記憶體、磁碟)、從而節省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支援的字元集以及當前的字元集
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: utf325 rows in set (0.06 sec)mysql> status;--------------mysql Ver 14.14 Distrib 5.5.16, for Linux (i686) using EditLine wrapperConnection id: 1Current database: information_schemaCurrent user: root@localhostSSL: Not in useCurrent pager: stdoutUsing outfile: ''Using delimiter: ;Server version: 5.5.16-log Source distributionProtocol version: 10Connection: Localhost via UNIX socketServer characterset: latin1Db characterset: utf8Client characterset: utf8Conn. characterset: utf8UNIX socket: /tmp/mysql.sockUptime: 2 min 9 sec
⑤ 對於InnoDB 建議使用varchar
現在很多場合都使用了InnoDB、算下來、varchar 又贏了
⑥ 儲存大資料
● BLOB:採用二進位儲存、沒有字元集或定序
● TEXT:採用字元方式儲存、有字元集和定序
最好盡量避免使用這兩、如果可以、可以把BLOB貨TEXT 列分離成單獨的表
對於使用了BLOB或TEXT大量刪除或更新時、
建議定期使用 optimize table 磁碟重組
㈢ 日期和時間類型
常見的有 datatime、timestamp 和 date
從儲存上看、timestamp 占 4 個位元組、其他兩個 8 個位元組
所以、若無意外、最好盡量使用 timestamp 、即使它比較調皮、例如和時區相關
By David Lin
2013-06-02
Good Luck