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 惯用的数据类型优化》,跪求各位点评,by
虽然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地址和整数之间相互转换。