一次线上事故,让我对MySql的时间戳存char(10)还是int(10)有了全新的认识

Mysql-时间的存储 datetime还是时间戳timestamp? c、然后mysql数据库接收到这个时间字符串2020-02-23080000后,由于数据库时区配置是东9区,它会认为这个时间是东9区的,它会以东9区解析这个时间字符串,这时数据库保存的时间是东9区的2020-02-23080000,也就是东8区的2020-02-23070000,保存的时间就偏差了1个小时。从上表可以看到,DATETIME默认占用5个字节,而TIMESTAMP默认占用4个字节,如果需要更高精度的存储(秒后的小数点个数,比如毫秒)那么需要额外的存储空间。...... 阅读详情

 

美好的周五

周五的早晨,一切都是那么美好。

 

然鹅,10点多的时候,运营小哥哥突然告诉我后台打不开了,我怀着一颗“有什么大不了的,估计又是(S)(B)不会连wifi”的心情,自信的打开了网址,果然,真打不开了。

这是存心让我过不好周末呀!

 

抓住那只bug

经过我缜密的排查,发现是一个“获取今天之前登录的用户”接口调用严重超时:

这个接口其实调用的数据表不多,在mysql只读取了1张表,表结构如下:

 

 

获取今天之前登录的用户列表的SQL如下:

SELECT u.email, log.user_id
FROM `user` u
LEFT JOIN `log_user_active` log ON u.user_id = log.user_id
WHERE log.`log_dtime` <1634567890
LIMIT 0 , 30

 

 这只是一个简单的sql查询,并没有什么高精尖、复杂的查询为什么这么慢?由于log_user_active的数据量最大,所以猜想应该是log_user_active表出了问题,为了排查原因,我把SQL又简化了下,去掉了JOIN直接简化为:

SELECT log.user_id
FROM `log_user_active`
WHERE `log_dtime` <1551784072
LIMIT 0 , 30

经执行,这个语句花了将近1秒。。。如果多人同时访问,MySql不崩溃才怪。

此时,应该确信是这个表出问题无疑了,但是字段log_dtime明明建立了索引,怎么还这么慢呢?

经过各种百度,终于发现问题所在:由于log_dtime设计的是char类型。如果想让他走索引,查询的时候值必须要加引号,说明这是个字符串,否则是不会走索引的。我的数据恰巧都是数字组成(时间戳),查询的时候也没有刻意去加引号,导致查询的时候不走索引。

这就是问题所在了,于是进行如下尝试:

尝试1:

SQL的值加上引号

 

如上图,果然极快。

但是这样的话,需要改好多代码,我想想还是尝试下方法2吧。

尝试2:

果断将数据表结构log_dtime设计为INT型,如图:

 

 再次执行SQL:

SELECT log.user_id
FROM `log_user_active`
WHERE `log_dtime` <1551784072
LIMIT 0 , 30

相应结果提升N倍:

 

 至此,问题处理完毕。

总结

char类型字段想走索引的话,必须用引号括起来。如果是时间戳等类型的纯数字,建议还是存为int型吧。

愉快的周末,又向我招手了。

SQL数据类型避坑指南:从字符串到日期的实战陷阱与修复 SQL数据类型是数据库与应用间最基础的契约约定,其本质是字段存储格式、精度范围和比较逻辑的统一声明。理解VARCHAR与NVARCHAR的编码差异、DECIMAL与FLOAT的精度机制、DATETIME2与DATE的时间语义,直接决定查询是否准确、计算是否可靠、系统是否健壮。当出现‘non-numeric character found’或‘string排序异常’等高频报错时,问题往往不在语法,而在类型定义与实际值之间的隐式转换或契约断裂。本文基于SQL Server、MySQL、PostgreSQL三大引 阅读详情

相关推荐

Ubuntu云服务器上安全创建MySQL/MariaDB表的完整实践指南

CREATE TABLE 是数据库设计的起点,其本质是定义数据存储结构、约束逻辑与访问契约。理解 MySQL 和 MariaDB 在 Ubuntu 系统层的差异(如包管理路径、认证插件、默认配置)是避免连接失败、字符乱码和权限异常的前提;掌握字段类型选择(BIGINT vs INT)、字符集(utf8mb4)与排序规则(utf8mb4_0900_as_cs)的工程影响,直接决定查询性能与扩展性。在云服务器受限资源下,还需权衡 innodb_buffer_pool_size、max_connections 等

426

MySql 时间戳存char还是存int?

一次小事故,让我对时间戳存char还是存int有了深刻的印象。 生产环境的sql条件涉及到时间戳字段的大小比较(between and),当时设计的时间戳类型是char(10),结果当数据量达到200万时,虽然建立了索引,但仍旧瞬间崩溃。查询时间到达几十分钟。 多方调试无果下,将时间戳类型是char(10)改成int(10),瞬间秒开。查询速度控制在了 0.03秒以内。性能提升万倍。 ...

ApiPost技术博客 1610

MySQL建表避坑指南:从字段类型到主键设计的生产级实践

MySQL建表是数据库开发的起点,本质是定义数据存储结构与访问契约。理解INT/BIGINT的符号性、VARCHAR在utf8mb4下的字节开销、DATETIME与TIMESTAMP的时区与范围差异,是避免线上事故的基础。主键选择直接影响聚簇索引性能和分布式扩展能力,而字符集(utf8mb4)、校对规则(utf8mb4_0900_ai_ci)和NOT NULL约束则决定了数据一致性与查询稳定性。这些设计决策不仅关乎语法正确性,更直接关联存储效率、并发吞吐与分库分表演进路径。本文聚焦真实生产场景中的建表逻辑、

weixin_30460489的博客 434

MySql存储日期类型用int、datetime还是varchar?

那要看你怎么取舍: 需要可读性好,那就使用datetime类型, 如果你对性能要求很高,那就必须使用int类型,而且int类型所占用的存储空间也比其他两种类型要少! 因为我做了测试: 数据库表里有五十万条数据,一个字段叫time1,是int类型,一个字段叫time2,是datetime类型,最后一个字段叫time3是var char (10)类型, int   查询5次分别是 0.858

tangxinzhuan 1万+

从零到一:构建高并发网上商城系统的MySQL数据库设计实战

本文详细介绍了构建高并发网上商城系统的MySQL数据库设计实战,涵盖用户系统分库策略、商品系统冷热分离、订单系统分表策略等核心内容。通过实战案例和优化技巧,帮助开发者解决数据热点、库存超卖和订单洪峰等高并发挑战,提升系统性能。

weixin_30703911的博客 396

视频编解码——视频编解码器工作原理

目录什么是视频编解码器为什么需要视屏编解码器视频编码器与数字视频容器时评编码器的历史 什么是视频编解码器 简单来说就是用于压缩或解压数字视频的软件或硬件 编码是信息从一种形式或格式转换为另一种形式的过程,解码是编码的反向。 适用于视频 编码是将视频、音频的原始格式的文件通过压缩技术转换成另一种格式(视频如h.264,h.265,m-jpeg等)。 解码是编码的反向过程。应用中,一般是将h.264,h.265格式数据解码成如YUV格式裸流交给显示器显示。 为什么需要视屏编解码器 需要在有限的带宽或存储空间

路人coder 1万+

Mysql - 如何决定用 datetime、timestamp、int 哪种类型存储时间戳?

背景 数据表都很可能会有一两个字段需要保存日期时间数据,那应该用什么 Mysql 类型来保存呢? 前面讲过 datetime、timestamp、int 的方式来保存日期时间 如何存储 10位、13位的 unix 时间戳? date、datetime、timestamp 的区别 本篇文章会对 datetime、timestamp、int 进行比较,然后对一些典型的查询进行基准测试,来决定什么...

qq_33801641的博客 6419

别再问ARM麒麟怎么装微信了!手把手教你用铠大师搞定Windows软件(飞腾/海思芯片实测)

本文详细介绍了如何在ARM架构的信创电脑(如飞腾/海思芯片)上使用铠大师安装和运行Windows软件,解决微信、Office等常用软件的兼容性问题。通过实测数据对比,铠大师在性能和易用性上显著优于传统方案,为麒麟系统用户提供了一套完整的解决方案。

weixin_28736355的博客 894

mysql用时间戳还是时间存储比较好

TIMESTAMP 通常占用的空间比 DATETIME 少,如果你对存储空间有限制,或者你需要存储大量的时间戳数据,TIMESTAMP 可能是更好的选择。- 如果你的应用需要在不同的时区中使用时间数据,或者需要自动处理夏令时的变化,使用 TIMESTAMP 可能更方便。- 考虑到不同的数据库系统和应用程序可能对时间类型的支持不同,选择一个能够满足你当前和未来需求的时间类型是很重要的。- 对于需要频繁进行日期和时间范围查询的场景,DATETIME 类型可能更适合,因为它允许更灵活的日期和时间计算。

qq_42572322的博客 1908

BlenderGis安装碰到问题,ImageIO、无法点击和地图不加载

BlenderGis安装碰到问题,ImageIO、无法点击和地图不加载问题

qq_45176349的博客 4965

【PLL】分频器设计权衡:从CMOS到CML的电路实现与优化

本文深入探讨了PLL中分频器的设计权衡,比较了CMOS和CML两种电路实现的优缺点。通过实际案例分析,展示了如何在速度、功耗和噪声之间取得平衡,特别是在5G射频芯片和Wi-Fi 6E等高频应用中的优化实践。文章还提供了混合架构设计和电源噪声协同优化的实用技巧,适合电路设计工程师参考。

weixin_42521843的博客 442

一次事故,我对MySQL时间戳存char(10)还是int(10)有了全新的认识

摘要:char类型字段想走索引的话,必须用引号括起来。如果是时间戳等类型的纯数字,建议还是存为int型吧。 本文分享自华为云社区《一次事故,我对MySql时间戳存char(10)还是int(10)有了全新的认识》,原文作者:奔四码农 。 美好的周五 周五的早晨,一切都是那么美好。 然而,10点多的时候,运营小哥哥突然告诉我后台打不开了,我怀着一颗“有什么大不了的,估计又是他不会连wifi”的心情,自信的打开了网址,果然,真打不开了。 这是存心让我过不好周末呀! 抓住那只bug 经过我缜

华为云官方博客 1679

DNS入侵检测 datacon2020

DNS入侵检测 datacon2020。

weixin_51491521的博客 523

Oracle数据类型深度解析:INT、NUMBER、CHAR与VARCHAR2选型实战指南

在数据库设计与性能优化中,数据类型的选择是基础且关键的一环。从原理上讲,数据类型定义了数据的存储格式、精度范围及运算规则,直接影响存储效率与查询性能。其技术价值在于,合理的数据类型能保障数据完整性、提升查询速度并降低存储成本。在应用场景上,无论是交易系统的金额字段、用户系统的字符信息还是日志系统的流水记录,都需要精准的类型匹配。特别是在处理海量数据或高并发查询时,不当的类型选择可能导致索引失效或隐式转换,进而引发性能瓶颈。本文聚焦于Oracle数据库中最常用的数值类型与字符类型,通过对比INT与NUMBER

weixin_30315723的博客 409

MITRE ATT&CK超详细学习笔记-01(背景,术语,案例)

MITRE是一个向美国政府提供系统工程、研究开发和信息技术支持的非营利性组织,于1958年从麻省理工学院林肯实验室分离出来后参与了许多最高机密的政府项目,开展了大量的网络安全实践。例如,MITRE公司在1999年发起了常见披露漏洞项目(CVE,CommonVulnera-bilitiesandExposures)并维护至今。其后,MITRE公司还维护了常见缺陷列表(CWE,CommonWeaknessEnumeration)这个安全漏洞词典。.........

Zichel77的博客 1万+

搞定最强大模型Gemini学生订阅,白嫖一年,包教包会

白嫖现在最强大模型

BUG猿的博客 2万+

MyBatis jdbcType详解:从线上事故到类型安全的最佳实践

在Java数据库编程中,JDBC类型映射是连接Java对象与SQL数据库的桥梁,其核心原理在于为PreparedStatement的参数提供精确的SQL类型信息。理解这一机制的技术价值在于确保类型安全、防止空值异常,并实现跨数据库的兼容性。尤其在处理null值时,若未显式指定类型,数据库驱动可能因无法推断SQL类型而抛出“Invalid column type”等错误。这一原理在MyBatis框架中通过jdbcType属性得以具体应用,它充当了Java类型与数据库类型间的“翻译官”。在实际开发场景中,无论是

weixin_34379433的博客 542

Sigrity System SI SerialLink模式进行Pcie3协议仿真分析操作指导-pcie3_client_single_pre

Sigrity System SI SerialLink模式提供了10个协议合规性检查工具模板,用户可以将根据实际应用替换模板中的SPICE文件,然后进行协议仿真分析,同时软件还提供了目标结果的模板MASK以及该协议需要检查的项目,通过协议分析视为满足设计要求,下面介绍pcie3_client_single_pre仿真分析,具体操作如下。Random(Rj):随机抖动,该抖动用高斯概率分布来描述,通常是由热噪声和其它随机噪声引起的,默认为1.24%UI RMS(平均值),即和标准值的偏差为1.24%UI。

weixin_54787054的博客 598

MySQL之DCL和多种数据类型的介绍

毕竟,如果日期时间信息分散在好几个字段,很不容易记,而且查询的时候,SQL语句也会更加复杂。TEXT文本类型,可以存比较大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建议使用CHAR,VARCHAR来代替。而且text和blob类型的数据删除后容易导致“空洞”,使得文件碎片比较多,所以频繁使用的表不建议包含TEXT类型字段,建议单独分出去,单独用一个表。此外,一般存注册时间、商品发布时间等,不建议使用DATETIME存储,而是使用时间戳,因为DATETIME虽然直观,但不便于计算。

qq_46130027的博客 127

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MySQL数据类型深度剖析:从底层原理到实战优化,一文彻底搞懂

数据库设计是一门权衡的艺术。数据类型的选择没有绝对的“最好”,只有“最适合”。在项目的初期,多花十分钟思考每个字段应该用什么类型,能为未来的运维减少无数个通宵加班的夜晚。记住:代码可以重构,表结构却很难。选对数据类型,是给未来最好的礼物。有任何关于MySQL数据类型的问题,欢迎在评论区留言,我会一一解答。让我们一起写出更健壮、更高效的数据库代码!

闵浮龙的博客 380

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Ubuntu云服务器上用MySQL/MariaDB命令行创建生产级数据表

CREATE TABLE是关系型数据库最基础也最关键的SQL操作,其本质是定义数据契约——通过字段类型、约束条件与索引策略,明确数据的结构、完整性与访问效率。理解VARCHAR与TEXT的存储差异、NOT NULL与DEFAULT的业务语义边界、AUTO_INCREMENT与UUID在分布式场景下的取舍,直接决定表能否支撑高并发、多地域、长生命周期的现代应用。在Ubuntu系统中,借助apt原生支持的MySQL或MariaDB服务,配合命令行脚本化建表,可实现环境一致、可复现、易运维的数据库初始化流程。本文

weixin_33713707的博客 497

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

MySQL建表实战:从基础语法到高级优化

数据库表结构设计是系统架构的核心基础,直接影响数据存储效率和查询性能。MySQL作为最流行的关系型数据库,其建表操作涉及数据类型选择、约束条件设置、索引优化等关键技术点。合理的表设计需要遵循数据库范式理论,同时结合实际业务场景进行反范式优化。在工程实践中,字符集配置、自增ID管理和分区表设计等细节常成为性能瓶颈。通过电商商品表、社交关系表等典型案例可以看出,优秀的表结构应当具备可扩展性、查询友好性和存储经济性。掌握这些建表技巧,能够有效避免后期数据迁移和结构调整带来的高昂成本。

weixin_34396103的博客 471

MySQL表约束:数据完整性的关键设计与实践

数据库约束是关系型数据库管理系统的核心机制,通过预定义规则保障数据完整性。从技术原理看,约束在存储引擎层实现数据验证,包括实体完整性(主键)、参照完整性(外键)以及域完整性(CHECK/NOT NULL)。在分布式系统和高并发场景下,合理使用约束能有效拦截脏数据,如电商系统通过外键避免幽灵订单,金融系统利用CHECK约束确保金额非负。MySQL 8.0增强的CHECK约束和函数索引,支持更复杂的业务规则校验。实践表明,约束虽带来约15%写入性能损耗,但能降低90%的数据修复成本,特别适合交易系统、ERP等对

weixin_30824479的博客 590
上一篇: 对标印度的PostMan,一款中国接口测试软件的崛起
下一篇: 接口测试工具ApiPost 发送报 socket hangup 的解决方案
博客园干货精选
博客等级 码龄10年 162粉丝 133原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值