如何选择优化的数据类型:

1、通常更小的更好

  相同级别的数据类型,选择占据空间更小的数据类型。更小的数据类型通常更快,因为占用更少的磁盘、内存和CPU缓存,处理时需要的

CPU周期也更少,但是要确保需要存储值的范围

2、简单更好

  一个列可以选择多种数据类型

  1、有限选择数据类型,整型比字符操作的代价更低

  2、其次是日期和二进制类型

  3、最后是字符类型

  4、使用MySQL内置的类型date、time、datetime而不是String存储时间和日期

  5、使用整型存储IP地址

3、尽量避免NULL

  1、定义表结构是没有指定列为NOT NULL,默认都是可以为NULL的,除非是真的需要存储NULL值,否则最好指定列为NOT NULL

  2、如果查询可为NULL的列,对MySQL来说更难优化,因为可谓NUL的列使索引、索引统计和值比较都更复杂。可为NULL的列使用更多的存储空间,

在MySQL中也要特殊处理。

  3、但是InnoDB使用单独的位(bit)存储NULL值,所以对于稀疏数据(很多值为NULL,只有少数行的列有非NULL值)有更好的空间效率,但是不适用于MyISAM

  所以,选择数据类型是,第一步需要确认合适的大类型:数字、字符串、时间等。

选择具体类型

  MySQL的数据类型可以存储相同类型的数据,只是存储的长度和范围不一样、允许的精度不同、物理空间不同

  例如:DATETIME和TIMESTAMP都可以存储时间和日期,但是后者只使用前者一般的存储空间,并且会根绝时区变化,有特殊的自动更新能力。

整数类型:

MySQL系列(一)--数据类型-LMLPHP

  存储的值的范围从-2^(N-1)到2^(N-1)-1,N为存储的位数

  可选UNSIGNED属性,表示不允许负值,大概可以使正数的上线提高一倍,例如TINYINT UNSIGNED存储的范围是0~255,而TINYINT的存储范围

是-128~127

  然而整数计算一般使用64位的BIGINT,JISHI ZAI 32位的环境(一些聚合函数是例外)

PS:指定宽度对大多数应用都是无意义的,只是显示字符的个数,对于存储和计算来说,INT(1)和 INT(20)是相同的,不要以为int(2)就是存储

两位,能节省空间。。。

浮点数/实数类型:

MySQL系列(一)--数据类型-LMLPHP

  float和double类型字段保存数据可以不指定精度,但是decimal类型字段如果不指定精度,默认为(10,0)

  CPU不支持DECIMAL的直接计算,而是MySQL服务器本身实现了DECIMAL的高精度计算,相对而言,CPU支持原生浮点极端,所以浮点计算明显更快。

  MySQL5.0+将数字打包保存到一个二进制字符串中(每4个字节存9个数字)。例如,DECIMAL(18,9)小数点两边各保存9个数字,一共使用9个字节

,小数点占用1个字节,最多65个数字

  浮点型相比DECIMAL存储同样范围的值时,使用更少的空间,所以只有对小数进行精确计算时才使用DECIMAL--例如存储财务数据。但是数据量

很大的时候,可以使用BIGINT代替

PS:浮点型是非精确的数据类型

时间类型:

MySQL系列(一)--数据类型-LMLPHP

  CURRENT_DATE() 返回当前日期值,不包括时间部分

  NOW() 返回时间和日期值

数据类型选择:

  当一个列有多种数据类型可以选择,选择顺序:数字类型、日期/二进制类型、字符类型,相同级别的数据类型,优先选择占用空间小的类型

varchar和char:

MySQL系列(一)--数据类型-LMLPHP

  char会将字符串末尾的空格自动删除,前面的空格不会删除,varchar不会

  InnoDB可以把过长的varchar存储为BLOB

  varchar节省了存储空间,所以对性能也有帮助。因为varchar是可变的,在update时可能使行变长,就需要额外的工作。

varchar(5)和varchar(200)存储'hello'的空间开销是一样的,那么使用更多的列有什么优势吗?

  更长的列会消耗更多的内存,因为MySQL通常会分配固定大小的内存块来保存内布置。尤其是使用内存临时表进行排序或操作时会特别糟糕。

还有利用磁盘临时表进行排序的时候。

  所以更好的策略是只分配真正需要的空间。

CHAR使用场景:

  1、几乎定长的字符串,例如密码的md5值(定长)、身份证号码等

  2、短字符串,例如Boolean类型Y和N,char要1byte,而varchar要2byte,因为还有一个计算长度的额外字节

  3、经常更新的字符串列,因为不容易产生碎片

二进制字符串类型:

MySQL系列(一)--数据类型-LMLPHP

BLOB和TEXT类型:为存储更大的数据而设计,分别采用二进制和字符方式存储,但是尽量避免使用

  字符类型:TINYTEXT/SMALLTEXT/TEXT/MEDIUMTEXT/LONGTEXT

  二进制类型:TINYBLOB/SMALLBLOB/BLOB/MEDIUMBLOB/LONGBLOB

两种类型区别:

  BLOB类型存储的是二进制数据,没有排序规则(和其它类型的排序不同,通常对每一列的最前max_sort_length字节进行排序,可以根据需求进行

配置或者使用ORDER BY SUSTRING(column,length))和字符集,而TEXT类型有字符集和排序规则

05-11 16:16
查看更多