程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL數據類型的最優選擇

MySQL數據類型的最優選擇

編輯:MySQL綜合教程

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved