《高性能MySQL》之选择优化的数据类型

1:前言

    mysql支持的数据类型很是多,选择正确的数据类型对于得到高性能相当重要

2:几个原则

  •    更小的一般更好---知足存储须要的状况下使用最小的数据类型,由于占用更小的磁盘,内存和cpu缓存,而且处理须要的cpu周期也更少。举个例子:咱们常用status 为 0,1 表示状态,这里使用TINYINT(-128-127)类型已经足够,没必要使用int。
  •   简单就好---简单数据类型的操做一般须要使用更小的CPU周期,整型比字符操做代价更低。
  •   尽可能避免Null--- 之前咱们表中包含不少为NULL的列,即便不须要保存Null,一般状况下最好指定为Not NULL,除非真的须要。缘由:1:优化须要,对于查询包含为NULL的列,会使索引,索引统计和值比较复杂,NULL会使用更多的存储空间,当NULL列被索引时须要一个额外的字节。2:程序问题,若是你domain中的变量没有定义成包装类,查询时不能将NULL保存到数据。因此这里同时建议程序中使用Integer 代替 int 在domain中。

3:整数类型

  mysql支持一下几种类型整数:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT。分别8,16,24,32,64为存储空间,范围-2(N-1)-2(N-1)-1,其中N是存储空间的位数。
   整数还有UNSINGED属性,表示不容许负值,可使正数的上限提升一倍,可是存储空间同样,性能同样。
   整数计算通常使用64位BIGINT整数,因此在代码中接收相似count(id)的结果时,要定义成BigInteger,否则会报错,
   对于存储和计算来讲,INT(1)和INT(20)是同样的。

4:实体类型

    实体是带有小数部分的数字。咱们不只能够用与存储小数部分,还可使用DECIMAL存储比BIGINT(能表示20位,18..)还大的整数。以前看到公司老系统中使用DECIMAL来表示数字类型一直不明白,可能存在这个缘由。
     在须要对小数进行精确计算时,才使用DECIMAL来表示(mysql5.0以上)

5:字符串类型

  varchar和char在不一样的存储引擎中存储方式不同。

   varchar

   varchar类型用于存储可变长字符串,比定长类型更节省空间,它仅使用必要的空间,如varchar(20) "abc" 仅使用3个字节,可是它会再拿出1或2个字节来记录字符串长度(大于255字节为2个),存储时会保留末尾空格,对于varchar来讲最好的策略是只分配真正须要的空间。

   使用状况:若是字符串列的最大长度比平均长度大不少;列的更新不多,因此碎片不是问题;使用了UTF-8这样的复杂字符集。mysql


    Char

    char 类型是定长,会删除全部的末尾空格,会根据须要采用空格进行填充以方便比较。

              使用状况:适合存储很短的字符串,或者全部值都接近一个长度,好比char 很是适合存储密码的MD5值,由于他是一个定长。咱们可使用char(1) 来存储只有Y和N的值,它只须要一个字节,而若是使用varchar(1)会占用两个字节。对于常常改变的数据,char也更好。

6:日期和时间类型

datetime
能保存大范围的值,从1001-9999年,精度为秒,格式YYYYMMDDHHMMSS的整数中,和时区无关
     

       timestamp

  保存了从1970年1月1日午夜的秒数,到2038年,显示的值和时区有关系。