选择优化的数据类型

选择优化的数据类型

数据类型的选择原则性能

  • 更小的一般更好。通常状况下,应该尽可能使用能够正确储存数据的最小数据类型。例如只须要存0~200,tinyint unsigned更好。
  • 简单就好。简单数据类型的操做一般须要更少的CPU周期。例如,整型字符串操做代价更低,由于字符集和校对规则(排序规则)使字符比较比整型比较更复杂。好比,应该使用MySQL内建的类型而不是字符串来存储日期和时间,另一个是应该用整型存储IP地址。
  • 尽可能避免NULL, 一般状况下最好指定列为not null, 除非真的须要存储null值。一般把null的列改成not null带来的性能提高比较小,因此调优时没有必要首先在现有schema中查找并修改掉这种状况,除非肯定这会致使问题。可是,若是计划在列上建索引,就应该尽可能避免设计成可为null的列。

MySQL支持别名,但它不会影响性能。优化

整型

分为整型和实数。若是储存整数。可使用:tinyint、smallint、mediumint、int、bigint,分别使用8,16,24,32,64位存储空间,储存的值的范围从-2^(N-1)到2^(N-1)-1,其中N是存储空间的位数。spa

整型类型有可选的unsigned属性,表示不容许负号,这大体可使正数的上限提升一倍。同时有符号和无符号类型(表示正负数)使用相同的储存空间,并具备相同的性能。设计

实数类型

实数是带有小数部分的数字。也可使用decimal存储比bigint还大的整数。code

浮点(float、double)和decimal类型均可以指定精度。浮点类型在存储一样范围的值时,一般比decimal使用更少的空间。由于须要额外的空间和计算开销,应该只在对小数进行精确计算时才使用decimal——例如存储财务数据。blog

字符串类型

varchar和char类型,下面的描述假设使用的存储引擎是InnoDB/MyISAM。排序

  • varchar类型用于存储可变长字符串。它比定长类型更节省空间,由于它仅使用必要的空间(例如,越短的字符串使用越少的空间)。 varchar的使用场景:字符串列的最大长度比平均长度大不少;列的更新不多;使用了像UTF-8这样复杂的字符集,每一个字符都使用不一样的字节数进行存储。
  • char类型是定长的:MySQL老是根据定义的字符串长度分配足够的空间。char类型使用场景:适合存储很短的字符串,或者全部值都接近同一个长度。好比:很是适合存储密码的MD5值,由于这是一个定长的值。储存常常变动的数据,char也比varchar更好,由于定长的char类型不容易产生碎片。对于很是短的列,char比varchar在存储空间上也更有效率,由于它不须要额外字节记录字符串的长度。例如用char(1)来存储只有Y和N的值。

最好的策略是只分配真正须要的空间。索引

Blob和text类型

Blob和text都是为了存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。ci

使用枚举(Enum)代替字符串类型

使用场景:
枚举列能够把一些不重复的字符串存储成一个预约义的集合而且除非能接受只在列表末尾添加元素,由于字符串列表是固定的,对于一系列将来可能会改变的字符串,使用枚举不是一个好主意。字符串

优势:
enum关联enum后,关联查询变得更快。当varchar列和enum列进行关联时则慢不少。
把varchar列转换为enum可让表的大小缩小,能够根据show table status命令输出结果中data_length列的值。

位数据类型

bit列,列在一列中存储一个或多个true/false值。对于大部分应用,最好避免使用这种类型,另外一个方法是建立一个char(1),用来存储0/1。

set列,若是须要保存不少true/false值,能够考虑合并这些列到一个set数据类型,它在MySQL内部是以一些列打包的位的集合来表示的。建议set列中的状况会同时出现时使用。
这样有效地利用了存储空间。一个包装位的应用的例子是保存权限的访问控制列表(ACL)。

CREATE TABLE acl(
    perms SET('can_read','can_wrtie','can_delete') NOT NULL
);

INSERT INTO acl(perms) VALUES('can_read,can_delete');
SELECT perms FROM acl WHERE FIND_IN_SET('can_delete',perms);--查询字段perms中包含can_delete的结果,返回结果为null或记录

结果:
image.png

相关文章
相关标签/搜索