Int、datetime、timestamp对比

存储日期使用 datetime 、timestamp 还是 int

int

  • 4个字节,存储范围从1970-01-01 08:00:00 到2038-01-19 11:14:07
  • 存什么取出来就是什么,需要自己进行格式转化和时区转化

datetime

  • 8个字节,存储范围1000-01-01 00:00:00 ~ 9999-12-31 23:59:59存什么取出来就是什么
  • 存什么取出来就是什么,需要自己进行时区转化

timestamp

  • 4个字节,存储范围同int
  • 根据会话时区自动时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区
  • 可以设置默认值和使用CURRENT_TIMESTAMP(),可以在创建或更新时自动修改值(5.6.5只能有一个自动更新,5.6.5后可以有多个)

那个的读取性能最佳

数据库版本

  • mysql 5.7.22

服务器配置

  • Intel(R) Xeon(R) CPU E5-2660 0 @ 2.20GHz
  • 两个物理CPU 每个8核 合计16核
  • 112G内存 512G SSD

数据表

  • table_time_innodb(存储引擎为innodb) 和 table_time_myisam(存储引擎为myisam) 数据结构一致,数据内容一致,单表150W数据,表结构如下
mysql> desc table_time_myisam;
+-------------+-----------+------+-----+-------------------+-----------------------------+
| Field       | Type      | Null | Key | Default           | Extra                       |
+-------------+-----------+------+-----+-------------------+-----------------------------+
| id          | int(11)   | NO   | PRI | 0                 |                             |
| f_int       | int(11)   | NO   | MUL | NULL              |                             |
| f_timestamp | timestamp | NO   | MUL | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| f_datetime  | datetime  | NO   | MUL | NULL              |                             |
+-------------+-----------+------+-----+-------------------+-----------------------------+

分析过程

数据查询与存储引擎,索引,筛选数据范围相关

筛选大范围数据, 时间范围为1411059647 到 1411340169,返回记录数713358

  • 选择存储引擎为myisam的表table_time_myisam, 相关字段都不加索引,筛选时间范围为1411059647 到 1411340169, 执行指定sql
  • 选择存储引擎为myisam的表table_time_myisam, 相关字段都加上索引,筛选时间范围为1411059647 到1411340169, 执行指定sql
  • 选择存储引擎为innodb的表table_time_innodb, 相关字段都不加索引,筛选时间范围为1411059647 到 1411340169, 执行指定sql
  • 选择存储引擎为innodb的表table_time_innodb, 相关字段都加上索引,筛选时间范围为1411059647 到1411340169, 执行指定sql
SELECT SQL_NO_CACHE COUNT(*) FROM {table_name} WHERE f_int >1410039647 AND f_int <1411340169;
SELECT SQL_NO_CACHE COUNT(*) FROM {table_name} WHERE f_timestamp >'2014-09-06 21:40:47' AND f_timestamp <'2014-09-21 22:56:09';
SELECT SQL_NO_CACHE COUNT(*) FROM {table_name} WHERE UNIX_TIMESTAMP(f_timestamp) >1410039647 AND UNIX_TIMESTAMP(f_timestamp) <1411340169;
SELECT SQL_NO_CACHE COUNT(*) FROM {table_name} WHERE f_datetime >'2014-09-06 21:40:47 AND f_datetime <'2014-09-21 22:56:09';
SELECT SQL_NO_CACHE COUNT(*) FROM {table_name} WHERE UNIX_TIMESTAMP(f_datetime) >1410039647 AND UNIX_TIMESTAMP(f_datetime) <1411340169;

筛选小范围数据, 时间范围为1411059647 到 1411340169,返回记录数93507

  • 选择存储引擎为myisam的表table_time_myisam, 相关字段都不加索引,筛选时间范围为1411059647 到 1411340169, 执行指定sql
  • 选择存储引擎为myisam的表table_time_myisam, 相关字段都加上索引,筛选时间范围为1411059647 到1411340169, 执行指定sql
  • 选择存储引擎为innodb的表table_time_innodb, 相关字段都不加索引,筛选时间范围为1411059647 到 1411340169, 执行指定sql
  • 选择存储引擎为myisam的表table_time_innodb, 相关字段都加上索引,筛选时间范围为1411059647 到1411340169, 执行指定sql
SELECT SQL_NO_CACHE COUNT(*) FROM {table_name} WHERE f_int >1411059647 AND f_int <1411340169;
SELECT SQL_NO_CACHE COUNT(*) FROM {table_name} WHERE f_timestamp >'2014-09-18 17:00:47' AND f_timestamp <'2014-09-21 22:56:09';
SELECT SQL_NO_CACHE COUNT(*) FROM {table_name} WHERE UNIX_TIMESTAMP(f_timestamp) >1411059647 AND UNIX_TIMESTAMP(f_timestamp) <1411340169;
SELECT SQL_NO_CACHE COUNT(*) FROM {table_name} WHERE f_datetime >'2014-09-18 17:00:47' AND f_datetime <'2014-09-21 22:56:09';
SELECT SQL_NO_CACHE COUNT(*) FROM {table_name} WHERE UNIX_TIMESTAMP(f_datetime) >1411059647 AND UNIX_TIMESTAMP(f_datetime) <1411340169;

结论

Int、datetime、timestamp对比_第1张图片
TIM截图20180504214841.png

你可能感兴趣的:(Int、datetime、timestamp对比)