当前位置: 首页 > news >正文

MySQL表添加了一个字段,竟然导致数据无法写入,反思

这是学习笔记的第 2152 篇文章


640?wx_fmt=gif

  今天有一个同事通过即时通讯工具找我,说需要做一个数据变更操作,我一看需求很简单,是新增了一个列,需要创建相关的索引。

  对于SQL自动化上线,目前算是到了收获的时段,从近期的工单情况来看,很多业务需求都从平台化的工单操作转向了自动化单据,按照最新的数据统计结果,假设有150个工单,那么100个左右都是自动化流程完成的,占比近70%。

 这个工单的操作是目前自动化不支持的,因为需求是删除已有的索引,然后添加新的索引字段。

 当我看到问题的时候,我感觉到一种异常,但是又实在说不清楚,所以准备当面沟通下。

 

640?wx_fmt=png

表结构信息如下:

CREATE TABLE `data_stat` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `day` int(8) NOT NULL DEFAULT '0',

  `kind` varchar(10) NOT NULL DEFAULT '',

  `netid` varchar(3) NOT NULL DEFAULT '',

  `item` varchar(10) NOT NULL DEFAULT '' ,

  `value` varchar(20) NOT NULL DEFAULT '',

  `room` varchar(10) NOT NULL DEFAULT 'null' ,

  PRIMARY KEY (`id`),

  KEY `idx_day_netid` (`day`,`kind`,`netid`,`item`)

) ENGINE=InnoDB AUTO_INCREMENT=55158 DEFAULT CHARSET=utf8 ;

大体的业务含义是对每一天的登录数据进行统计,原本是3个维度(kind,netid,item),现在多了一个维度(room)。

举个小例子,数据可以这样描述:

在2019-01-01(day)这一天用户通过手机(kind)登录了网站,使用的是5G手机(netid),连接的就近站点(room)是北京,在线时长(item)为5分钟(value)。

此时我需要了解的是业务的查询模型,即通常都有哪些场景的查询,而一旦这个room新字段在复合索引中,而如果条件不满足,则这个索引列不会被用到,其实效果更糟。 

而通过沟通,我惊奇的发现业务对于这个表的使用是有问题的。他说如果不添加索引字段room,业务就写入不了数据了。 

这个大大超出了我的预期,大家可以仔细看下这条SQL,按照我刚刚描述的场景,是否能够理解。

经过沟通,理解了这个业务场景,总算是明白了为什么业务写入不了数据。

可以使用如下的两条数据描述来说明:

第1条记录:

2019-01-01(day)用户通过手机(kind)登录了网站,使用的是5G手机(netid),连接的就近站点(room)是北京,在线时长(item)为5分钟(value)

第2条记录:

2019-01-01(day)用户通过手机(kind)登录了网站,使用的是5G手机(netid),连接的就近站点(room)是北京,在线时长(item)为15分钟(value)

在这种情况下,因为字段(day,kind,netid,item)是唯一性索引,那么第2条记录对应的数据是无法写入的。 

所以按照这种设计,如果后续还有新的字段,那索引就需要横向扩展了,所以对于这个问题,我提出了改进建议。 

索引确实需要重建,根据业务反馈的查询场景,其实添加非唯一性索引(`day`,`netid`,`room`)已经足够覆盖目前的查询,而更有意义的是:数据写入不会因为索引设计不合理/新增业务字段而导致数据无法写入。 

所以在明确了需求之后,帮业务同学重建了索引,这个问题的处理就告一段落。 

这个问题带给我的总结就是:

  1. 对于潜在的问题,第一要旨就是参考标准,如果违反了标准,我们可以很快发现潜在问题,而不是屈从于被动响应业务。 

  2. 对于沟通,我们尽可能避免一些聊天式沟通,越是不够明确清晰,我们的沟通成本反而更高,所以对于一些模糊问题,几句话解释不清楚的,我都喜欢当面沟通。 

  3. 理解业务需求的深层次含义。这个业务开始的反馈是很紧急,通过熟悉业务后的改进来看,其实和开始的描述是有偏差的,业务紧急的深层次含义其实是业务因为新增字段导致写入不了数据了,所以迫切需要重建索引。而我们理解这个问题的出发点是基于数据统计查询。而帮助业务解决了这个问题之后,对他们来说,收益更大,所以在沟通中也就淡化了这种紧急度。 

  4. 需要换位思考,从熟悉业务的角度来进行优化调整。在这个过程中,我是本着帮他的态度去理解这个问题的,在沟通中不断的调整自己的问题分析方向,最终发现这个问题,解决这个问题的过程其实是无法预料到这么多潜在的问题的,而逐步理解了业务,也就掌握了主动性。

  5. 索引优化的知识补充,通过这个问题,无论是历史遗留还是新人犯的错误,其实都从侧面反映出我们需要提供一些可供参考的技术建议,这是一个持续改进的过程。

近期热文:

转载热文:

相关文章:

  • 通过Maxwell解析MySQL Binlog,打好业务多活的基础
  • 快到买买买的日子了,对于买书我提几点建议
  • 深度解读:我为什么从来不过“双十一”
  • 《黑客与画家》经典语录
  • 一个MySQL服务CPU 100%的优化案例反思
  • MySQL双主模式下是如何避免数据回环冲突的
  • MySQL中的SQL优化建议那么多,该如何有的放矢
  • dbaplus广州站归来
  • 梳理这件事情做不好,很多努力都是白费
  • 怎么证明根号2是无理数,我们来推导和计算,还有逼格极高的算法
  • 行锁:InnoDB 替代 MyISAM 的重要原因
  • 数据双向复制中的6个数据冲突场景和解决思路
  • MySQL多活数据消费服务设计方案
  • 数学有趣地超乎你的想象
  • MySQL中10多张表关联要做优化,怎么理解逻辑幂等
  • 《深入 React 技术栈》
  • 【Linux系统编程】快速查找errno错误码信息
  • 2019年如何成为全栈工程师?
  • CentOS 7 修改主机名
  • crontab执行失败的多种原因
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • exif信息对照
  • in typeof instanceof ===这些运算符有什么作用
  • JS基础之数据类型、对象、原型、原型链、继承
  • Python中eval与exec的使用及区别
  • 翻译:Hystrix - How To Use
  • 关于Java中分层中遇到的一些问题
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 近期前端发展计划
  • 前端相关框架总和
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 思否第一天
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 以太坊客户端Geth命令参数详解
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • !$boo在php中什么意思,php前戏
  • #每日一题合集#牛客JZ23-JZ33
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • $forceUpdate()函数
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (二)WCF的Binding模型
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (四)JPA - JQPL 实现增删改查
  • (转)关于多人操作数据的处理策略
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET多线程执行函数
  • []指针
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [bzoj1912]异象石(set)
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
  • [C#]winform部署yolov5-onnx模型
  • [C#]使用PaddleInference图片旋转四种角度检测