博客
关于我
mysql数据库时间类型datetime、bigint、timestamp的查询效率比较
阅读量:789 次
发布时间:2023-02-12

本文共 2839 字,大约阅读时间需要 9 分钟。

数据库时间类型存储与查询性能比较

在实际应用开发中,选择合适的时间类型存储是数据库性能优化的重要环节。本文通过对不同时间类型存储和查询操作的性能测试,得出了一些实用的存储和查询建议。

数据库时间类型存储选择

数据库中常用的时间类型包括datetime、timestamp和bigint。具体选择哪种类型存储时间字段,需要根据实际需求来决定。以下是各类型的特点及适用场景:

  • datetime:存储精确到秒的时间,占用了4个字节,兼容ANSI和ISO标准。
  • timestamp:存储精确到秒的时间,同样占用4个字节,但仅支持标准时间范围。
  • bigint:存储时间作为整数值,精确到毫秒,占用8个字节,支持更大的时间范围。
  • 数据库前期准备

    在进行性能测试之前,需要准备一张包含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
    1. 实体类定义
    2. public class Users {    private Long id;    private Date timeDate;    private Timestamp timeTimestamp;    private long timeLong;}
      1. DAO层接口
      2. 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);}
        1. 测试数据生成
        2. 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查询速率测试

          通过对不同时间类型的查询性能进行测试,我们可以看出:

        3. datetime类型查询
        4. select count(*) from users where time_date >="2018-10-21 23:32:44" and time_date <="2018-10-21 23:41:22"

          耗时:0.171s

          1. timestamp类型查询
          2. select count(*) from users where time_timestamp >= "2018-10-21 23:32:44" and time_timestamp <= "2018-10-21 23:41:22"

            耗时:0.351s

            1. bigint类型查询
            2. select count(*) from users where time_long >= 1540135964091 and time_long <= 1540136482372

              耗时:0.130s

              结论:在InnoDB存储引擎下,通过时间范围查找,bigint类型的查询性能优于datetimetimestamp类型。

              SQL分组速率测试

              对于分组操作,bigint的性能表现不如datetimetimestamp

            3. datetime类型分组
            4. select time_date, count(*) from users group by time_date

              耗时:0.176s

              1. timestamp类型分组
              2. select time_timestamp, count(*) from users group by time_timestamp

                耗时:0.173s

                结论:在InnoDB存储引擎下,通过时间分组,timestamp类型的性能略优于datetime类型,但两者相差不大。

                SQL排序速率测试

                对于排序操作,bigint类型的性能最优:

              3. datetime类型排序
              4. select * from users order by time_date

                耗时:1.038s

                1. timestamp类型排序
                2. select * from users order by time_timestamp

                  耗时:0.933s

                  1. bigint类型排序
                  2. select * from users order by time_long

                    耗时:0.775s

                    结论:在InnoDB存储引擎下,通过时间排序,bigint类型的性能优于timestamp类型,timestamp类型又优于datetime类型。

                    小结

                    在实际应用中,数据库中时间字段的存储类型选择需要根据具体需求来决定。如果需要对时间字段进行范围查询或排序操作,建议使用bigint类型存储。如果对时间字段不需要进行任何操作,建议使用timestamp类型,因为它既节省了存储空间(4个字节),又能满足大部分时间记录需求。

    转载地址:http://hcdfk.baihongyu.com/

    你可能感兴趣的文章
    mysql分库分表中间件简书_MySQL分库分表
    查看>>
    MySQL分库分表会带来哪些问题?分库分表问题
    查看>>
    MySQL分组函数
    查看>>
    MySQL分组查询
    查看>>
    Mysql分表后同结构不同名称表之间复制数据以及Update语句只更新日期加减不更改时间
    查看>>
    mySql分页Iimit优化
    查看>>
    MySQL分页查询
    查看>>
    mysql列转行函数是什么
    查看>>
    mysql创建函数报错_mysql在创建存储函数时报错
    查看>>
    mysql创建数据库和用户 并授权
    查看>>
    mysql创建数据库指定字符集
    查看>>
    MySql创建数据表
    查看>>
    MySQL创建新用户以及ERROR 1396 (HY000)问题解决
    查看>>
    MySQL创建用户与授权
    查看>>
    MySQL创建用户报错:ERROR 1396 (HY000): Operation CREATE USER failed for 'slave'@'%'
    查看>>
    MySQL创建索引时提示“Specified key was too long; max key length is 767 bytes”
    查看>>
    mysql初始密码错误问题
    查看>>
    mysql判断某一张表是否存在的sql语句以及方法
    查看>>
    mysql加入安装策略_一键安装mysql5.7及密码策略修改方法
    查看>>
    mysql加强(1)~用户权限介绍、分别使用客户端工具和命令来创建用户和分配权限
    查看>>