存储日期使用 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后可以有多个)
那个的读取性能最佳
数据库版本
服务器配置
- 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;
结论