MySQL 資料類型的最優選擇

來源:互聯網
上載者:User
     謹慎選擇資料類型很重要、為啥哩?可以提高效能、原理如下:
     
     ● 儲存(記憶體、磁碟)、從而節省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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.