MySql 时间戳存char还是存int?

通过将时间戳从char(10)改为int(10),解决了大量数据查询时的性能瓶颈,查询速度从几十分钟降低到0.03秒内,性能提升显著。

一次小事故,让我对时间戳存char还是存int有了深刻的印象。

生产环境的sql条件涉及到时间戳字段的大小比较(between and),当时设计的时间戳类型是char(10),结果当数据量达到200万时,虽然建立了索引,但仍旧瞬间崩溃。

用ApiPost接口调试文档生成工具查询响应时间,时间到达几十分钟。

多方调试无果下,将时间戳类型是char(10)改成int(10),瞬间秒开。查询速度控制在了 0.03秒以内。

性能提升万倍。

ApiPost介绍:

ApiPost 是一个可直接生成文档的API调试、管理工具,支持模拟会员登录请求,支持GET、POST、PUT、DELETE等常见API请求方式,类似POSTMAN和RAP的结合体,是团队协作最佳API管理工具。

官网地址: https://www.apipost.cn

**时间戳**并不一定特指毫秒数,其具体含义取决于上下文和系统实现,但通常分为以下两种类型: --- ### **1. Unix时间戳(秒级/毫秒级/纳秒级)** - **定义**:Unix时间戳是从 **1970年1月1日 00:00:00 UTC** 开始计算的秒数(或毫秒数、纳秒数)。 - **常见精度**: - **秒级**:10位数字(如 `1634567890`)。 - **毫秒级**:13位数字(如 `1634567890123`,秒级时间戳 × 1000)。 - **纳秒级**:部分系统(如高斯数据库)支持更高精度。 - **示例**: - 当前秒级时间戳(Python): ```python import time print(int(time.time())) # 输出:1634567890 ``` - 毫秒级时间戳(JavaScript): ```javascript console.log(Date.now()); // 输出:1634567890123 ``` --- ### **2. 数据库中的时间戳类型** - **高斯数据库(GaussDB)的时间戳**: - 默认是 **带时区的时间戳**(`TIMESTAMP WITH TIME ZONE`),储格式为 `YYYY-MM-DD HH:MI:SS.MS+TZ`(如 `2023-10-25 14:30:45.123+08`)。 - **不直接储Unix时间戳**,但可通过函数转换: ```sql -- 将当前时间转为Unix秒级时间戳 SELECT EXTRACT(EPOCH FROM CURRENT_TIMESTAMP); -- 输出:1634567890.123456 -- 将Unix毫秒级时间戳转为时间戳 SELECT TO_TIMESTAMP(1634567890123 / 1000.0); -- 输出:2021-10-18 14:38:10+00 ``` - **其他数据库的时间戳**: - MySQL:`TIMESTAMP` 类型储秒级时间戳(范围较小),`DATETIME` 储日期时间。 - PostgreSQL:支持微秒级精度,可通过 `EXTRACT(EPOCH FROM ...)` 获取秒级时间戳。 --- ### **关键区别** | **概念** | **Unix时间戳** | **数据库时间戳** | |----------------|-----------------------------|-----------------------------| | **单位** | 秒/毫秒/纳秒 | 日期+时间(可带时区) | | **储方式** | 数字(如 `1634567890`) | 格式化字符串(如 `2023-10-25`) | | **用途** | 跨系统时间计算、排序 | 记录事件发生时间、查询范围 | --- ### **常见问题** 1. **为什么数据库时间戳和Unix时间戳不一致?** - 数据库时间戳可能包含时区信息,而Unix时间戳是UTC绝对时间。 - 精度不同(如数据库支持微秒,Unix时间戳可能是毫秒)。 2. **如何选择时间戳类型?** - 需要跨系统同步时间?用 **Unix时间戳**(数字类型)。 - 需要记录日期时间并支持查询?用 **数据库时间戳**(如 `TIMESTAMP`)。 --- ### **示例:高斯数据库中的时间戳转换** ```sql -- 1. 获取当前Unix秒级时间戳 SELECT EXTRACT(EPOCH FROM CURRENT_TIMESTAMP); -- 2. 将Unix毫秒级时间戳转为时间戳 SELECT TO_TIMESTAMP(1634567890123 / 1000.0); -- 3. 格式化时间戳为字符串 SELECT TO_CHAR(CURRENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.MS'); ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值