MySql 惯用的数据类型优化

MySql 常用的数据类型优化

近期要对一个主要用来查询的MySql DB进行优化,所以从书上以及网络上总结了些MySql数据类型相关的优化。

-使用简单的数据类型

越简单的数据类型,需要的CPU周期就越少。

比较两个整数的代价肯定小于比较字符,因为字符集和排序规则让字符更复杂。

日期和时间尽量用MySql内奸的类型来保存,避免使用字符串

-要建索引的列避免NULL

当可空列被索引时,每条记录都需要一个额外的字节。MySql难以优化引用了可空列的查询,这样的列会使索引更加复杂

可以用 0、空字符串等代替NULL,不过把NULL列改为NOT NULL并不会带来明显的性能提升,不要期望太高。

-整数

整数在MySql中有以下类型,后面的注释是他们需要多少位的存储空间

TINYINT // 8位
SMALLINT // 16位
MEDIUMINT // 24位
INT // 32位
BIGINT // 64位

虽然MySql可以对整数类型定义宽度(如:INT(10)),但它不会限制值的范围,对于存储和计算INT(1)和INT(10)是一样的,没有优化的作用

-字符串(仅限于InnoDB的VARCHAR和CHAR)


VARCHAR 可变长度的字符串

  适合最大长度远大于平均长度,并且很少发生更新的场景。(更新的时候可能引起额外工作:如果行的长度增加并不再适合于原始位置时,InnoDB可能要进行分页)

还有要注意的是,VARCHAR要尽量分配真正需要的空间,因为mysql通常会分配固定大小的内存块来保存值,对于排序或基于内存的临时表,把VARCHAR限制的更小显然更好。


CHAR固定长度的字符串

  适合存储很短或长度基本相同的字符串。对于经常被更新的值,固定长度的行不易产生碎片。

-ENUM

有时可以用ENUM代替字符串,ENUM可以存储65535个不同字符串,还有mysql会根据列表中值的数量,把它压缩到1到2个字节中

-时间

DATETIME

  精度为秒,mysql把它封装在一个格式为YYYYMMDDHHMMSS的整数中,占8个字节

TIMESTAMP

  格林尼治时间以来的秒数,精度依然为秒,占4个字节,mysql有两个函数:FROM_UNIXTIME和UNIX_TIMESTAMP来让日期和时间戳相互转换

由于TIMESTAMP比DATETIME更省空间,通常应该优先使用TIMESTAMP。

另外mysql事件的最细粒度为秒,如果需要秒以下精度的时间,可以使用BIGINT类型保存为时间戳

-特殊类型的数据

以前经常用VARCHAR(15)列来保存IP地址。其实IP地址实际是一个无符号的32为整数,而不是字符串。使用小数点进行分割纯粹是为了增加可读性。应该使用无符号整数来保存IP地址,

mysql提供了INET_ATON和INET_NTOA函数在IP地址和整数之间相互转换。

MySql 惯用的数据类型优化

相关文章:

你感兴趣的文章:

标签云: