欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

简单了解mysql存储字段类型查询效率

程序员文章站 2022-06-22 10:19:13
检索性能从快到慢的是(此处是听人说的): 第一:tinyint,smallint,mediumint,int,bigint 第二:char,varchar 第三:null解释(转载):整数类型1...

检索性能从快到慢的是(此处是听人说的):

  • 第一:tinyint,smallint,mediumint,int,bigint
  • 第二:char,varchar
  • 第三:null

解释(转载):

整数类型

1、tinyint,smallint,mediumint,int,bigint,分别用8,16,24,32,64存

2、整数都有unsigned可选属性 (拿tinyint字段来举例,unsigned后,字段的取值范围是0-255,而signed的范围是-128 - 127。 那么如果我们在明确不需要负值存在的情况下,通常是不要设置signed来支持负数的。)

3、对于存储和计算来说int(1)和int(20)是相同的,int(n)中n只是规定了一些交互工具来显示字符的个数

字符类型

char定长,存储效率不如varchar,对于短数据的查询优于varchar

固定长度的。比如使用uuid作为主键,那用char应该更合适。

null类型

1、索引null列要额外的空间

2、进行比较和计算时会对null值进行处理,可能导致索引失效

所以尽量不要使用null 类型,多使用整数类型

另外,时间日期数据类型

1、不要用字符串存储日期型数据,浪费空间

2、date能保存从1001到9999年,精度为秒,他把日期和时间封装到格式为yyyymmddhhmmss的整数中,使用8字节

3、timestamp保存了从1970年以来的秒数,和unix时间戳相同,只能保存1970到2038,使用4字节

4、from_unixtime()和unix_timestamp()两个函数转换日期和unix时间戳

5、date和timestamp中存的是时间,但是是哪里的时间呢???:前者不管哪里,他就是一个时间表示(与时区无关),后者是格林尼治时间。。就是说存储时date就按照给的时间存,timestamp则是在先根据所在时区和给的时间戳算出对应的格林尼治时间再存,访问时date就按照他存的时间返回,timestamp则是根据存的时间戳(看作格林尼治时间)和所在时区算出所在时区的对应时间。

6、通常用timestamp,空间效率高

7、mysql没有提供比秒更小粒度的日期和时间值,如果需要,可以用bigint存储微妙级别的时间戳,或用double存储秒之后的小数部分。

实数类型

1、金融类要用decimal

2、decimal可以保存bigint范围外的整数

3、float和double使用标准的浮点运算进行近似计算

char 和 varchar

1、char是定长,varchar是变长,也就是varchar节省空间(除非使用row——format=fixed创建的话)

2、因为varchar是变长的,所以update时如果长度变长,就会做额外的工作

3、下列情况使用varchar:字符串列的最大长度比平均长度大很多;列的更新很少(所以碎片不是问题);使用了像utf8这样的字符集(每个字符都使用不同的字节数进行存储)

4、char适用情况:很短,或者所有值都接近同一个长度(如md5);列经常变更

5、末尾空格问题:高版本varchar会保留末尾空格;char和低版本varchar会剔除末尾空格。

6、char(n),varchar(n)中n表示字符数,而非字节数(中文字符在utf8中占用3字节)

7、虽然varchar(n)数据类型在磁盘中存的就是他所表示的字符串的大小,但是读取到内存中的时候内存是会给他分配n*k+1or2(n<=255,1;else 2;)(k根据字符集决定)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。