良好的逻辑设计和物理设计事高性能的基石,在进行数据库设计时,咱们应该要考虑到将来将会执行的查询语句,这就须要对各类因素进行权衡。本文将会聊一聊数据库(MySQL)设计中有关数据类型优化的一些内容。如下内容总结自《高性能 MysQL》。数据库
咱们知道 MySQL 支持多种数据类型,一般状况下,不少数据类型均可以完成相同的工做,选择正确的数据类型对于高性能相当重要。在明确须要优化的数据类型前,咱们须要先掌握几个原则,这些原则有助于咱们做出更好的选择。服务器
这里的轻量指的是,在通常状况下,应该使用能够正确存储数据的最小数据类型。例如一个列中的最大值为 2020,那就不必选择 INT 以及更大的数据类型。微信
简单的数据类型一般意味着处理时须要更少的 CPU 周期。例如,整型比字符操做代价更低;存储日期/时间应该用内置的数据类型而不是字符串;存储 IP 地址时应该用整型而不是字符串。数据库设计
一般状况下,应该设置列为 NOT NULL。由于 NULL 会使某个列的索引、值等数据的处理变得复杂。并且可为 NULL 的列会使用更多的存储空间。工具
对于整数,可选的数据类型有 TINYINT、SMALLINT、MEDIUMINT、INT 和 BIGINT。分别使用 八、16,24,32,64 位存储空间。同时可选的属性有UNSIGNED,表示不容许有负值,这可让正数的上限提升一倍。例如 TINYINT 的存储范围是-128~127
,TINYINT UNSIGNED 的存储范围是0~255
。性能
MySQL 能够为整数类型制定宽度,例如 INT(11),可是并不会限制数值的合法范围,只会控制某些交互工具用来显示字符的个数,对于存储和计算来讲,INT(1)和 INT(20)是相同的。即括号中的数字只是用于控制显示的字符数,和实际能够存储的字符数无关。优化
实数是带有小数部分的数字,MySQL 中使用 DECIMAL 类型用于存储精确的小数,可是 CPU 不支持对 DECIMAL 的直接计算,所以 MySQL 服务器自身实现了 DECIMAL 的高精度计算。设计
与此同时 CPU 支持原生浮点计算,所以浮点数的运算速度相对 DECIMAL 会更快。浮点分为两种:FLOAT 和 DOUBLE。因为 DOUBLE 相对于 FLOAT 有更高的精度和更大的范围,MySQL 使用 DOUBLE 做为内部浮点计算的类型。code
由于须要额外的空间和计算开销,因此应该尽可能只在对小数进行精确计算时才使用 DECIMAL,例如财务数据。数据量较大时,也能够考虑使用 BIGINT 代替 DECIMAL,将须要存储的货币单位根据小数的位数乘以相应的倍数便可。cdn
经常使用的是 VARCHAR 和 CHAR
VARCHAR
CHAR
所以两者的使用场景也很明显:
VARCHAR 适合字符串列的最大长度比平均长度大不少,同时列的更新不多,以及列中的字符串使用复杂的字符集,每一个字符都使用不一样的字节数进行存储(UTF-8)。
CHAR 适合存储很短的字符串,或者全部值都接近同一个长度,例如存储密码的 MD5 值,或者用 CHAR(1)存储只有 Y 和 N 的值,由于 CHAR(1)须要一个字节,VARCHAR(1)须要两个字节(须要一个记录长度的额外字节)。
DATETIME
TIMESTAMP
由于 TIMESTAMP 是用 4 个字节存储,所以最多只能保存到 2038 年,这一点也形成了很是著名的2038 年问题。
标识符是用于标识列与其余值进行比较(例如关联操做中,经过标识列寻找其余列),标识列在选择数据类型时,应该跟关联表中的对应列同样的类型。
整数类型一般是最好的选择,效率高且能够自增加(例如主键)。若是能够,尽可能避免使用字符串做为标识列,消耗空间,且查询速度慢。
有些特殊的数据须要用一些数据类型专门存储,例如存储 IP 地址应该用无符号整数,由于 IP 地址本质上是 32 位无符号数,并非字符串,用小数点将地址分红四段只是方便阅读。
想要提升 MySQL 的效率,能够作的功课很是多,数据库的数据类型优化也只是其中很小的一点,本文也只是挑出了经常使用的数据类型进行介绍。有兴趣的能够仔细阅读《高性能 MySQL》这本书,你能够在微信公众号「01 二进制」后台回复「高性能 MySQL」获取本书。
大道至简,尽量将事情保持简单老是好的,MySQL 喜欢简单,但愿使用数据库的你也会喜欢简单。