1、字段类型设计原则

  • 更小的就是更好的:更小的字段类型通常更快,以为它们占用更小的磁盘、内存、缓存使用,降低I/O开销,而且需要的CPU处理周期更短。
  • 简单就好:简单的数据类型需要更少的CUP周期
  • 尽量避免NULL:可为NULL的列会使用更多的存储空间,当这个字段作为索引时,每个索引记录需要一个额外的字节。
  • 不要用字符串存储时间和数值,他们在存储和排序上的差距较大

2、MySQL常用字段类型有:

  1)数值类型:

字段类型 大小(字节) 值范围
tinyint 1 (-128,127)
smallint 2 (-32768,32767)
mediumint 3 (-2^23,2^23-1)
int/integer 4 (-2^31,2^31-1)
bigint 8 (-2^63,2^63-1)
float 4  
double 8  
decimal(m,n)    
  •   整数类型可设置宽度,如int(1)、int(11),事实上对大多数应用它是无意义的,它们的存储是一样,性能也是一样,只是让客户端看到的信息不一样。
  •   decimal(m,d)允许最多65个数字,m是最大精度,d是小数精度;CUP不支持decimal的直接计算,MySQL通过内部方式实现高精度计算,相对原生浮点类型,计算速度要慢。浮点类型(float、double)在存储同样范围的值时,通常比decimal占用更少的空间,只有需要对小数进行精确计算时才使用decimal(例如财务数据)。

  2)字符类型:

字段类型 大小(字符) 说明
char 0-255 固定长度字符
varchar 0-65535 可变长字符
tinyblob    
blob    
mediumblob    
longblob    
tinytext   最多存255个字符
text   最多存65535字符
mediumtext    
longtext    
  • 字符的存储方式跟引擎相关,我们这里说明的是InnoDB引擎。
  • 关于char和varchar
    • varchar可变字符串,相对char更节省存储空间(表的ROW_FORMAT=FIXEX例外,它的每一行都使用定长存储)
    • varchar需要额外的1或2个字节记录字符串长度,当最大长度小于等于255时,使用1个字节,超过255时使用2个字节。例如varchar(10)需要11个字节存储,varchar(1000需要1002个字节存储。
    • varchar节省存储空间,所以对性能有帮助。但由于行是变长的,所以update时可能使行变的更长,这样就需要额外的工作。如果一个行占用空间增长且在页内没有更多的存储空间,MyISAM会将行拆成不同的片段存储,InnoDB则需要分裂页来使行可以放到页内。
    • 适合varchar类型的列:字符串列最大长度比平均长度大很多;列更新很少。char适合很短的或者长度接近的字符串。对于非常短的列,char存储上更有效率。
    • char和varchar存储的是字符,使用UTF-8字符串时,每个字符占用的字节数不同。
  • 关于blob和text类型
    • blob存储的是2进制,没有排序规则和字符集,text有排序规则和字符集
    • MySQL对blob和text的排序与其他类型不同,它只对每个列的最前max_sort_length字节而不是整个字符串排序。如果只需排序前面的一小部分,我们可以调整max_sort_length配置,或者使用order by sustering(column,length)
    • MySQL不能将blob和text的全部字符串进行索引,也不能使用这些索引消除排序。

  3)时间类型:

字段类型 大小(字节) 值范围 显示格式 说明
year 1 [1901,2155] yyyy  
date 3 [1000-01-01,9999-12-31] yyyy-MM-dd 日期
time 3   HH:mm:ss 时间
datetime 8   yyyy-MM-dd HH:mm:ss 日期和时间
timestamp 4   yyyy-MM-dd HH:mm:ss.SSS 时间戳,可精确微妙,精度的位数可定义。

  4)其他:

字段类型 说明
bit 二进制字符串,长度1-64
set 集合类型,存储上实际是int类型
enum 枚举类型,最多支持65535个枚举项。枚举类型内部使用int类型存储
  • 在MySQL5前,bit是tinyint的同义词。bit的行为因存储引擎而已,MyISAM按位进行存储,如bit(17)有17位,它使用3个字节存储,Memory和InboDB位每个bit列使用足够存储的最少整形。MySQL把bit当做字符串类型,而不是数字类型。
  • 枚举类型enum,最多有65535个枚举项,但真使用这么多项我们的应用会非常复杂。枚举适合少量枚举且相对固定的数据。 
  • MySQL没有bool(常用tinyint(1)或bit(1)表示布尔类型)、long类型
posted on 2020-05-01 21:04  玄同太子  阅读(1345)  评论(0编辑  收藏  举报