数据类型的选择原则性能
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。排序
最好的策略是只分配真正须要的空间。索引
Blob和text都是为了存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。ci
使用场景:
枚举列能够把一些不重复的字符串存储成一个预约义的集合而且除非能接受只在列表末尾添加元素,由于字符串列表是固定的,对于一系列将来可能会改变的字符串,使用枚举不是一个好主意。字符串
优势:
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或记录
结果: