读高性能Mysql---4--Schema与数据类型优化 有感

版权声明: https://blog.csdn.net/thedarkclouds/article/details/84581541

Schema与数据类型优化

选择优化的数据类型

1.更小的通常更好

       占用更少磁盘,内存和CPU缓存,处理的CPU周期也更少

2.简单就好

       减少CPU操作周期,整型比子夫操作代价更低,

3.尽量避免null

     null值对sql更难优化,null的列使得索引,索引统计和值得比较更为复杂,且null会使用更多存储空间;

     为null的列被索引,每个索引记录需要额外的字节。

     通常把null列改为not null带来新能提升较小,所以调优时没必要首先定位这种问题,除非确定这会导致问题。但是计划

     在列上建立索引,尽量避免设计null的列。

     当然也有列外,Innnodb使用单位的为(bit)存储null值,所以对于稀疏数据(很多为null,少数列有值)有很好的空间效率

    不适用于mMyIsam

   

     列如:TIMESTAMP只使用DATETIME一般的存储空间,根据时区变化,具有自动更新能力。TIMESTAMP允许的时间范围        更小,也是他的障碍。

1:整数类型


  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)是一样的。

mysql可以为整数类型指定宽度,列如int(11),没有意义,他不会限制值得合法范围,只是用来显示值得字符个数。

2:实数类型


   实体是带有小数部分的数字。  float double 我们不仅可以用与存储小数部分,还可以使用DECIMAL(精确计算)存储比BIGINT(能表示20位,18..)还大的整数。之前看到公司老系统中使用DECIMAL来表示数字类型一直不明白,可能存在这个原因。
     在需要对小数进行精确计算时 如财务数据,才使用DECIMAL来表示(mysql5.0以上)

3:字符串类型


  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也更好。
 

    

猜你喜欢

转载自blog.csdn.net/thedarkclouds/article/details/84581541