mysql线上连接超时和字段过长排查思路

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: mysql线上连接超时和字段过长排查思路

读书忌死读,死读钻牛角。——叶圣陶


1 orm和mysql字段的长度



sqlalchemy 用model创建表之后 如果你指定了varchar的长度是20 那么第一次用orm生成表的时候length=20 但是当你插入21个字符的时候 报错pymysql.err.DataError: (1406, "Data too long for column 'name' at row 1")。我们修改mysql字段长度到25 再次插入21个字符 但是记住我们并没有修改model的长度 也就是说model还是20字符长,我们最后发现成功插入数据库表中。


结论

model中varchar的长度只是第一次创建表的时候有用,后面只要通过mysql表字段去修改了,即使model varchar不修改,也没有问题。当然如果表字段varchar改为text也没有问题 即使数据库表字段是varchar。


2 数据库引擎没有设置超时



2.1 背景


我们发现,各个子页面都会调用大数据一个查询DB的操作,而这个数据大概是8千万。我们的sqlalchemy session查询非常耗时,大概50s左右,但是后来又满满好了,查询在1s左右。为了重现线上的问题我们做一下分析


2.2 分析


其实有时候我们遇到这样的问题,首先想到的就是优化查询,比如通过explain看看有没有命中索引啊,是否用到文件排序或者说回表查询啊,这种思路挺对的,你也必须过一遍,过完之后发现你的查询很NB,没什么问题,那这个时候我们就要站在更高的角度去看待问题,不要死死盯着你的sql,因为你再怎么优化无济于事。


考虑到是大数据环境,偶尔查询慢是正常的,因为有很多因素,比如带宽啊,网络啊以及负载啊之类的。所以我们怀疑如果这些因素导致我们查询慢,一定是我们那里没有设置超时时间导致sql变慢的,后来追溯源码,发现引擎底层是支持read_timeout的,而我们代码中在创建连接的时候并没有指定,因此必须立刻马上现在解决它。


2.3 解决


但是线上数据都是1s左右返回,如何线下模拟呢?


解决方案:锁表

先在创建engin的时候传入参数


比如


创建engine的时候,设置参数connect_args={"read_timeout":5} .这样创建的engine就会在读取数据超时的情况下抛出超时异常。

再把整个表以write的方式锁住,这样其他session就没办法查询或者修改,直到锁释放才会执行,否则会一直阻塞。这样我们就可以解决超时的现象。


我们先开启一个session会话,比如mysql终端。然后lock table big_data write; 然后我们程序启动,自然开启session去执行big_data的查询。这样等待5s之后抛出异常,完美还原案发现场


最后unlock tables


3   小结



有时候大家碰到问题,要经常汇总和整理,这样下次遇到类似问题直接找出来用,当你累积到一定程度,那么像这样的问题其实就是自然而然的解决了。


4 关注公众号



微信公众号:堆栈future

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
29天前
|
关系型数据库 MySQL
mysql增加修改删除字段
mysql增加修改删除字段
14 0
|
1月前
|
分布式计算 关系型数据库 数据处理
Dataphin常见问题之没有建表的权限如何解决
Dataphin是阿里云提供的一站式数据处理服务,旨在帮助企业构建一体化的智能数据处理平台。Dataphin整合了数据建模、数据处理、数据开发、数据服务等多个功能,支持企业更高效地进行数据治理和分析。
|
1月前
|
SQL 关系型数据库 MySQL
阿里云MySQL数据库价格、购买、创建账号密码和连接数据库教程
阿里云数据库使用指南:购买MySQL、SQL Server等RDS实例,选择配置和地区,完成支付。创建数据库和账号,设置权限。通过DMS登录数据库,使用账号密码访问。同地域VPC内的ECS需将IP加入白名单以实现内网连接。参考链接提供详细步骤。
372 3
|
24天前
|
存储 关系型数据库 MySQL
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
|
1天前
|
存储 SQL 关系型数据库
MySQL Group 字段逗号链接
【4月更文挑战第26天】
|
1天前
|
关系型数据库 MySQL 数据挖掘
【MySQL】多表连接查询
【MySQL】多表连接查询
|
2天前
|
安全 关系型数据库 MySQL
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
11 3
|
5天前
|
关系型数据库 MySQL 数据安全/隐私保护
使用Navicate连接Mysql过程详解
使用Navicate连接Mysql过程详解
14 0
|
5天前
|
存储 数据可视化 关系型数据库
MySQL字段的时间类型该如何选择?千万数据下性能提升10%~30%🚀
本文探讨MySQL中时间类型的选择,阐述datetime、timestamp、整形时间戳等类型特点以及它们在千万级数据量下的查询性能
MySQL字段的时间类型该如何选择?千万数据下性能提升10%~30%🚀
|
9天前
|
SQL 关系型数据库 MySQL
mysql 数据库查询 查询字段用逗号隔开 关联另一个表并显示
mysql 数据库查询 查询字段用逗号隔开 关联另一个表并显示
19 2