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

原创文章,转载请注明: 转载自搞代码

本文链接地址: MySql 惯用的数据类型优化

微信支付二维码

微信 赏一包辣条吧~

支付宝支付二维码

支付宝 赏一听可乐吧~

评论

0条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注