《高性能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这样的复杂字符集。


    Char

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

              使用情况:适合存储很短的字符串,或者所有值都接近一个长度,比如char 非常适合存储密码的MD5值,因为他是一个定长。我们可以使用char(1) 来存储只有Y和N的值,它只需要一个字节,而如果使用varchar(1)会占用两个字节。对于经常改变的数据,char也更好。

6:日期和时间类型

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

       timestamp

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

你可能感兴趣的:(MySql)