mysql数据库时间类型datetime、bigint、timestamp的查询效率比较
datetime:存储精确到秒的时间,占用了4个字节,兼容ANSI和ISO标准。 timestamp:存储精确到秒的时间,同样占用4个字节,但仅支持标准时间范围。 bigint:存储时间作为整数值,精确到毫秒,占用8个字节,支持更大的时间范围。 数据表结构:
发布日期:2025-04-17 23:14:29
浏览次数:72
分类:精选文章
本文共 2839 字,大约阅读时间需要 9 分钟。
数据库时间类型存储与查询性能比较
在实际应用开发中,选择合适的时间类型存储是数据库性能优化的重要环节。本文通过对不同时间类型存储和查询操作的性能测试,得出了一些实用的存储和查询建议。
数据库时间类型存储选择
数据库中常用的时间类型包括datetime、timestamp和bigint。具体选择哪种类型存储时间字段,需要根据实际需求来决定。以下是各类型的特点及适用场景:
数据库前期准备
在进行性能测试之前,需要准备一张包含50万条数据的测试数据集。以下是测试数据集的结构和内容:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `time_date` datetime NOT NULL, `time_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `time_long` bigint(20) NOT NULL, PRIMARY KEY (`id`), KEY `time_long` (`time_long`), KEY `time_timestamp` (`time_timestamp`), KEY `time_date` (`time_date`)) ENGINE=InnoDB AUTO_INCREMENT=500003 DEFAULT CHARSET=latin1
- 实体类定义:
- DAO层接口:
- 测试数据生成:
- datetime类型查询:
- timestamp类型查询:
- bigint类型查询:
- datetime类型分组:
- timestamp类型分组:
- datetime类型排序:
- timestamp类型排序:
- bigint类型排序:
public class Users { private Long id; private Date timeDate; private Timestamp timeTimestamp; private long timeLong;} public interface UsersMapper { @Insert("insert into users(time_date, time_timestamp, time_long) value(#{timeDate}, #{timeTimestamp}, #{timeLong})") @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") int saveUsers(Users users);} public class UsersMapperTest extends BaseTest { @Resource private UsersMapper usersMapper; @Test public void test() { long time = System.currentTimeMillis(); for (int i = 0; i < 500000; i++) { usersMapper.saveUsers(Users.builder() .timeDate(new Date(time)) .timeLong(time) .timeTimestamp(new Timestamp(time)) .build()); } }} SQL查询速率测试
通过对不同时间类型的查询性能进行测试,我们可以看出:
select count(*) from users where time_date >="2018-10-21 23:32:44" and time_date <="2018-10-21 23:41:22"
耗时:0.171s
select count(*) from users where time_timestamp >= "2018-10-21 23:32:44" and time_timestamp <= "2018-10-21 23:41:22"
耗时:0.351s
select count(*) from users where time_long >= 1540135964091 and time_long <= 1540136482372
耗时:0.130s
结论:在InnoDB存储引擎下,通过时间范围查找,bigint类型的查询性能优于datetime和timestamp类型。
SQL分组速率测试
对于分组操作,bigint的性能表现不如datetime和timestamp:
select time_date, count(*) from users group by time_date
耗时:0.176s
select time_timestamp, count(*) from users group by time_timestamp
耗时:0.173s
结论:在InnoDB存储引擎下,通过时间分组,timestamp类型的性能略优于datetime类型,但两者相差不大。
SQL排序速率测试
对于排序操作,bigint类型的性能最优:
select * from users order by time_date
耗时:1.038s
select * from users order by time_timestamp
耗时:0.933s
select * from users order by time_long
耗时:0.775s
结论:在InnoDB存储引擎下,通过时间排序,bigint类型的性能优于timestamp类型,timestamp类型又优于datetime类型。
小结
在实际应用中,数据库中时间字段的存储类型选择需要根据具体需求来决定。如果需要对时间字段进行范围查询或排序操作,建议使用bigint类型存储。如果对时间字段不需要进行任何操作,建议使用timestamp类型,因为它既节省了存储空间(4个字节),又能满足大部分时间记录需求。
发表评论
最新留言
很好
[***.229.124.182]2026年06月09日 10时24分19秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
php将多个值的数组去除重复元素
2023-03-01
php局域网上传文件_PHP如何通过CURL上传文件
2023-03-01
PHP工具插件大全
2023-03-01
php布尔值的++
2023-03-01
PHP常量、变量作用域详解(一)
2023-03-01
PHP应用目录结构设计
2023-03-01
PHP应用程序连接MSQL数据库Demo(附crud程序)
2023-03-01
PHP应用程序连接Oracle数据库Demo(附Oracle客户端安装文件)
2023-03-01
PHP开发api接口安全验证
2023-03-01
PHP开发规范PSR
2023-03-01
PHP开发遇到错误0001
2023-03-01
php异常处理
2023-03-01
PHP引入了泛型和集合两大重要特性,大大改善 PHP 代码的可维护性和可读性
2023-03-01
PHP引擎php.ini参数优化
2023-03-01
PHP引用(&)使用详解
2023-03-01
php引用及垃圾回收
2023-03-01
php当前时间的集中写法
2023-03-01
php微信 开发笔记,微信WebApp开发总结笔记
2023-03-01
php微信公众号开发access_token获取
2023-03-01