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 、即使它比較調皮、例如和時區相關