MySQL Schema与数据类型的优化

选择优化的数据类型:

  • 一、 更小的一般更好:

通常状况下,应该尽可能使用能够正确存储数据的最小数据类型。更小的数据类型一般更快,由于他们占用更少的磁盘,内存和cpu缓存,而且处理时须要的cpu周期也更少。mysql

  • 二、 简单就好

简单的数据类型操做一般须要更少的cpu周期。例如,整型比字符操做代价更低,由于字符集和校对规则(排序规则)使字符比较比整型更加复杂。注:应使用mysql内建的类型存储时间和日期,而不是字符串。sql

  • 三、 尽可能避免null

若是查询中包含可为null的列,对Mysql来讲更难优化,由于可为null的列使得索引、索引统计和值都比较复杂。可为null的列会使用更多的存储空间,在mysql中也须要特别处理。当可为null的列被索引时,每一个索引记录须要一个额外的字节。缓存

一般把可为null的列改成not null带来的性能提高比较小。在调优时,没有必要首先在现有的shema中查找并修改掉这个状况,除非肯定这会致使问题。可是若是列上建索引,就应尽可能避免设计成可为null的列。服务器

 

整数类型:

整数类型有TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT。分别使用8,16,24,32,64位存储空间。他们能够存储的值的范围从-2的(n-1)次方到2的(n-1)次方-1,其中n是存储空间的位数。性能

整数类型有可选的UNSIGNED属性,表示不容许负值,这大体能够是正数的上限提升一倍。例如TINYINT UNSIGNED能够存储的范围是0~255,而TINYINT的存储范围是-128~127。优化

 

实数类型:

实数是带有小数部分的数字。而后,他们不只仅为了存储小数部分;也可使用DECIMAL存储比BITINT还大的整数。MYSQL既支持精确类型,也支持不精确类型。spa

DECIMAL类型用于存储精确的小数,由于double类型和float类型在进行计算时,会由于精度损失致使一些数据的误差。可是DECIMAL数据类型cpu不支持对其直接计算,cpu直接支持原生浮点计算,因此浮点运算明显更快。操作系统

由于须要额外的空间和计算开销,因此应该尽可能只在对小数进行精确计算时才使用DECIMAL-例如存储财务数据。可是在数据量比较大的时候,能够考虑使用BITINT代替DECIMAL,将须要存储的货币单位根据小数的位数乘以相应的倍数便可。设计

 

字符串类型(varchar和char)

  • Varchar:

    Varchar类型用于存储可变长字符串,是最多见的字符串类型。他比定长类型更节省空间,由于它仅使用必要的空间(例如,越短的字符串使用越少的空间)。因此,varchar节省了存储空间,对性能也有帮助。可是,因为行是边长的,在update是可能使行变得比原来更长,这就致使须要作额外的操做。若是一个行占用的空间增加,而且页内没有更多的空间存储。MyISAM会将行拆成不一样的片断存储,InnoDB则须要分裂页来使行能够放进页内。排序

注:InnoDB更加灵活,它能够把过长的varchar存储为BLOB。

 

  • Char类型:

   Char类型适合存储很短的字符串,或者全部值都接近同一个长度。例如,char类型很是适合存储密码的md5值,由于他是定长的值。还有用户的身份证号以及手机号码。对于常常变动的数据,char也比vachar更好,由于定长的char类型不容易产生碎片。对于很是短的列,char也比varchar在存储空间上更有效率。例如用char(1)存储Y和N的值,若是采用单字节字符集只须要一个字节,可是varchar(1)却须要两个字节,由于还有一个记录长度的额外字节。

      Varchar(5)和varchar(200)存储‘hello’时空间开销是同样的,可是Varchar(5)会有很大的优点,由于更长的列会消耗更多的内存,由于Mysql一般会分配固定带下的内存块来保存内部值。尤为是使用内存临时表进行排序和操做时会特别糟糕。在利用磁盘临时表进行排序时也一样糟糕。

 时间类型

DateTime和TimeStamp

  • DateTime

    这个类型能保存大范围的值,从1001年到9999年,精度为秒。它把日期和时间封装到格式为YYYYMMDDHHMMSS的整数里,与时区无关。使用8个字节的存储空间。

  • TimeStamp:

        存储1970年1月1日午夜以来的描述,他和Unix时间戳相同。TimeStamp只使用4个字节的存储空间,所以它的范围比DateTime小的多;只能表示从1970年到2038年。

TimeStamp显示的值也依赖于时区。Mysql服务器,操做系统,以及客户端链接都有时区设置。

TimeStamp也有DATETIME没有的特殊属性。默认状况下,若是插入时没有指定第一个TimeStamp列的值,Mysql会设置这个列的值为当前时间。在插入一行记录时,Mysql默认也会更新第一个TimeStamp列的插入和更新操做。最后,TimeStamp列默认为not null,这也和其余的数据类型不同

相关文章
相关标签/搜索