Mysql 数据类型优化(三)

人盡茶涼 提交于 2019-11-26 16:44:18

一、日期与时间类型

    MySQL 可以使用许多类型来保存日期和时间值。

    如:YEAR和DATE。MySQL能存储的最小时间粒度为秒(MariaDB支持微秒级别的时间类型)。但是MySQL也可以使用微妙级的粒度进行临时运算,我们会展示怎么绕开这种存储限制。

    DATETIME

        这个类型能保存大范围的值,从1001年到9999年,精度为秒。它把日期和时间封装到格式为YYYYMMMDDHHHMMSS的整数中,与时区无关。使用8个字节的存储空间。

默认情况下,MySQL以一种可排序的无歧义的格式显示 DATETIME值,例如“2015-10-24 09:57:33”.这是ANSI标准定义的日期和时间表示方法。

    TIMESTAMP

    就像它的名字一样,TIMESTAMP类型保存了1970年1月1日0点(格林尼治标准时间)以来的秒数,它和UNIX时间戳相同。TIMESTAMP只使用4个字节的存储空间,因此它的范围比DATETIME小的多:只能存储 1970 到 2038年。

如果在多个时区存储或访问数据,TIMESTAMP和DATETIME的行为将很不一样。

TIMESTAMP提供的值与时区有关系,后者刚保留文本表示的日期和时间。

也可以指定TIMESTAMP的  添加 与更新的行为,TIMESTAMP列的默认为NOT NULL

除了特殊的行为之外 ,通常也应该尽量用TIMESTAMP,因为它比DATETIME空间效率更高有时候人们会将Unix时间戳存储为整数值,但这不会带来任何收益。用整数保存时间戳的格式通常不方便处理,所以不推荐这样做。


如果需要存储比秒更小的粒度日期和时间怎么办?

MySQL目前没有提供合适的数据类型,但是可以通过使用自己的格式存储: 可以使用BIGINT类型存储微级别的时间戳,或者使用DOUBLE存储秒之后的小数部分。这两种方式,都可以,或者可以使用MariaDB替代MySQL

二、位数据类型

    MySQL有少数几种存储类型使用紧凑的位存储数据。所有这些位类型,不管底屋存储格式和处理方式如果 ,从技术上来说都是字符串类型。

    BIT

    在MySQL 5.0 之前,BIT是TINYINT的同义词。但是在MySQL5.0以及更新的版本,这是一个特性完全不同的数据 类型。

    BIT列,可以存储一个或多个ture/false 值。BIT(1)定义一个包含单个位字段,BIT(2)存储2个位,BIT例最大长度是64个位。

MySQL把BIT当作字符串类型,而不是数字类型,当检索BIT(1)的值是一个包含二进制0或1的字符串,而不是ASCII码的“0”或“1”。然而在数字 上下文场景中检索时,结果将是位字符串转换成的数字 。需要和另外的值比较结果 ,一定要记得这一点。

对于大部分应用,最好避免使用这种类型。

SET

    如果需要在保存很多的true/false 值,可以考虑,合并这些列到一个SET数据类型,它在MySQL内部是以一系列打包的位的集合来表示的。这样就有效的我利用了存储空间,并且MySQL有像FIND_IN_SET()和FILED()这样的函数,方便地在查询 中使用。

缺点:改变列的定义代价较高:需要ALTER TABLE ,这对大表来说是非常昂贵的操作。



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!