mysql当中时间类型是如何存储的
2015-08-11 17:48
381 查看
一直很好奇时间类型在mysql中的存储形式,终于在mysql官网中找到了答案:
下面的表格描述了不同时间类型在不同数据库版本中是如何存储的。
在MYSQL 5.6.4之前,日期跟时间类型是按照以下编码进行存储的:
YEAR: 一个字节的整型
DATE: 三个字节的整型,按照这种方式进行压缩: YYYY×16×32 + MM×32 + DD
TIME: 三个字节的整型,按照这种方式进行压缩:DD×24×3600 + HH×3600 + MM×60 + SS
TIMESTAMP: 四个字节的整型,计算UTC时间,计算从('1970-01-01 00:00:00' UTC)到指定时间的秒数
DATETIME: 八个字节,四个字节代表日志的整型,按照这种方式进行编码: YYYY×10000 + MM×100 + DD ,四个字节代表时间,按照这种方式进行编码: HH×10000 + MM×100 + SS
从5.6.4版本开始,TIME,TIMESTAMP,DATTIME这三种类型增加了对小数秒的支持,对这三种类型的存储采用了大端(big endian)的字节排序方式(为了兼容memcmp()),小数秒部分跟在非小数秒后面。(YEAR和DATE类型的存储方式不变)
TIME类型的非小数秒部分编码如下:
TIMESTAMP 非小数秒部分的编码与 5.6.4之前的版本一样,只是字节排序方式由小端排序改为了大端排序(little endian--->big endian)
DATETIME 非小数秒部分的编码如下:
sign标志位为1,代表整数;0禁止使用
小数秒部分的编码根据小数秒的精度进行调整,如下:
根据以上的描述,我们是不是可以推测出,在对时间字段建立索引以后,在进行索引比较时,是不是会将我们输入的时间转换为以上类型再进行比较?从而可以确定对时间类型的字段建立索引,其效率与在整型字段上建立索引的效率是一样的?还请数据库高手给与解释。
下面的表格描述了不同时间类型在不同数据库版本中是如何存储的。
Type | Storage before MySQL 5.6.4 | Storage as of MySQL 5.6.4 |
YEAR | 1 byte, little endian | Unchanged |
DATE | 3 bytes, little endian | Unchanged |
TIME | 3 bytes, little endian | 3 bytes + fractional-seconds storage, big endian |
TIMESTAMP | 4 bytes, little endian | 4 bytes + fractional-seconds storage, big endian |
DATETIME | 8 bytes, little endian | 5 bytes + fractional-seconds storage, big endian |
YEAR: 一个字节的整型
DATE: 三个字节的整型,按照这种方式进行压缩: YYYY×16×32 + MM×32 + DD
TIME: 三个字节的整型,按照这种方式进行压缩:DD×24×3600 + HH×3600 + MM×60 + SS
TIMESTAMP: 四个字节的整型,计算UTC时间,计算从('1970-01-01 00:00:00' UTC)到指定时间的秒数
DATETIME: 八个字节,四个字节代表日志的整型,按照这种方式进行编码: YYYY×10000 + MM×100 + DD ,四个字节代表时间,按照这种方式进行编码: HH×10000 + MM×100 + SS
从5.6.4版本开始,TIME,TIMESTAMP,DATTIME这三种类型增加了对小数秒的支持,对这三种类型的存储采用了大端(big endian)的字节排序方式(为了兼容memcmp()),小数秒部分跟在非小数秒后面。(YEAR和DATE类型的存储方式不变)
TIME类型的非小数秒部分编码如下:
1 bit sign (1= non-negative, 0= negative) 1 bit unused (reserved for future extensions) 10 bits hour (0-838) 6 bits minute (0-59) 6 bits second (0-59) --------------------- 24 bits = 3 bytes
TIMESTAMP 非小数秒部分的编码与 5.6.4之前的版本一样,只是字节排序方式由小端排序改为了大端排序(little endian--->big endian)
DATETIME 非小数秒部分的编码如下:
1 bit sign (1= non-negative, 0= negative) 17 bits year*13+month (year 0-9999, month 0-12) 5 bits day (0-31) 5 bits hour (0-23) 6 bits minute (0-59) 6 bits second (0-59) --------------------------- 40 bits = 5 bytes
sign标志位为1,代表整数;0禁止使用
小数秒部分的编码根据小数秒的精度进行调整,如下:
FSP | Storage |
0 | 0 bytes |
1,2 | 1 byte |
3,4 | 2 bytes |
4,5 | 3 bytes |
相关文章推荐
- Mysql组合查询-UNION-多个SELECT语句作为单个查询结果返回
- mysql备份
- mysql 不能登录
- JDBC+MySql 1(编码问题的处理)
- 利用Navicat传输MySql中不同数据库的数据
- 初步了解MySQL 数据库
- MySQL数据库性能优化专题
- mysql主从复制
- mysql 存储过程中sum 结果赋值给变量的坑
- MySQL Study之--Percona Server版本
- MySQL支持的列类型
- MySQL Study之--MySQL关闭自动commit(autocommit)
- MySQL事务隔离
- Mysql学习笔记
- 免安装版mysql配置
- MySQL Study之--MySQL关闭自动commit(autocommit)
- 客户端(远程连接)MySQL数据库服务器
- mySQL 关于bool类型
- Mssql链接mysql数据库
- MySQL AUTO_INCREMENT 简介