我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【MySQL】最容易忽略的常识

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【MySQL】最容易忽略的常识

起因
  开发反馈一个表的数据大小已经130G,对物理存储空间有影响,且不容易做数据库ddl变更。咨询了开发相关业务逻辑,在电商业务系统中,每笔订单成交之后会有一条对应的订单物流信息,因此需要设计一个物流相关的表用来存储该订单的物流节点信息,该表使用text字段存储物流信息。
【MySQL】最容易忽略的常识
大致的表结构:
CREATE TABLE `goods_order_express` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `express_id` int(10) unsigned NOT NULL,
  `message` varchar(200) NOT NULL,
  `status` varchar(20) NOT NULL,
  `state` tinyint(3) unsigned NOT NULL,
  `data` text NOT NULL,
  `created_time` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_expid` (`express_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;

业务分析
当快递每到达一个中转站或者发生揽件,接收等事件,快递公司的api都会生成如下格式的信息(去掉业务相关敏感数据) 
[{"time":"2016-03-16 11:16:20","ftime":"2016-03-16 11:16:20","context":"四川省成都市TD客户一公司 已发出,下一站成都转运中心","areaCode":"","areaName":"","status":"在途"},{"time":"2016-03-16 11:11:03","ftime":"2016-03-16 11:11:03","context":"四川省成都市TD客户一公司 已打包","areaCode":"","areaName":"","status":"在途"},{"time":"2016-03-16 11:08:09","ftime":"2016-03-16 11:08:09","context":"四川省成都市TD客户一公司 已揽收","areaCode":"","areaName":"","status":"收件"}]
该json 串 411个字符,开发业务程序去定期轮训调用相关api信息,并把上面的json串数据 insert 或者update 到goods_order_express的data字段。而且该表从开始到现在从未删除,积累了初始到现在的所有数据。随着公司业务爆发式增长,该表未来会更大,而且增长速度会更快。数据库服务器的磁盘空间面临不足,表结构变更难以操作。
如何优化?
1 能否减小数据量写入?
   和业务分析,我们不能丢弃新增的数据。但是每一笔物流信息实际上是有生命周期的,从发货到收件完成即可完成其生命周期,也就是该数据可以不再展示了,我们基本不会查看一个已经收到货的物流信息。因此可以针对历史数据进行归档,比如将90天之前的数据备份到hbase中并且从MySQL 数据库中删除,从而维持该表的大小在一个合理的范围。
2 减少data 字段数据大小
a 缩小json串数据,保留有效数据
time 和ftime 是一样的,和开发确认ftime无功能使用,在我们的物流展示系统中 areaCode areaName也没有逻辑意义。
故对json数据做如下精简 
[{"time":"2016-03-16 11:16:20","context":"四川省成都市TD客户一公司 已发出,下一站 成都转运中心","status":"在途"},{"time":"2016-03-16 11:11:03","context":"四川省成都市TD客户一公司 已打包","status":"在途"},{"time":"2016-03-16 11:08:09","context":"四川省成都市TD客户一公司 已揽收","status":"收件"}]
精简之后占用的字符数由411个减小为237个,减少47%的数据。
b 评估物流节点数
相信大家都有网购的经验 ,一般情况下快递大约含有15-20个节点信息
{"time":"2016-03-16 11:16:20","context":"四川省成都市TD客户一公司 已发出,下一站 成都转运中心","status":"在途"} 占用85个,我们按照100个字符来评估,物流信息最大20*100=2000个字符,使用varchar(2048) 应该可以满足正常需求。
c 可能有人会说凡事总有例外,那我们从这个例外分析一下 如果一个物流有30或者40个节点信息 怎么办?
从深圳到黑龙江漠河 或者新疆乌鲁木齐到杭州,上海的节点信息估计会比较多。对于20个以上 的节点信息 我们不会去关注其中第10个 11个 14个 15个节点的信息。大家对快递的关注点是什么? 商家是否发货?快递公司是否揽件? 快递是否到达目的地的最后1公里。分析到这里,我们可以针对超过25个/30个以上的节点进行收缩处理,去掉中间非核心节点信息,在不影响用户体验的情况下,满足我们的varchar(2048)的设计。
3 分库分表
  这点是迫不得已而为之的方案。现在虽然各种中间件都比较成熟,cobar,oneproxy ,mycat等靠谱的软件,但是对于一个创业公司目前我们还缺少相对应的分布式数据库的管理工具,1024个表如何做变更?这个其实也是一个相对比较困难的问题。

小结 
   经过一系列的分析和优化,我们最终将text字段转化为varchar(2048),发布到线上目前运行良好。回顾上面的优化过程是建立在对业务逻辑和物流相关知识有深入理解,对用户行为多加分析的基础之上的,该过程不需要高深的数据库知识。但是实际上开发往往简单粗暴的接受pd的功能设计理念,而不顾对底层基础架构的影响。其实只需要向前多走一步,我们可以做的更好,只不过这一步,可能是 优秀的程序员的一小步,是某些人的一大步。
留给大家一个问题:如何看待和解决 开发快速迭代带来的技术债?

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【MySQL】最容易忽略的常识

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Word2010中最容易被忽略的基本操作技巧

  在word的使用中,有一个很实用的技巧经常会被大家忽略,就是首字下沉。把word文档段落的第一个字进行首字下沉的设置,可以很好的凸显出段落的位置和其整个段落的重要性,能够起到突出内容以及吸引注意的效果。  关于word2010首字下沉的相关教程也相对较少,所以今天小编将会针对Word2010讲述设置首字下沉的方法,
Word2010中最容易被忽略的基本操作技巧
2024-04-17

Java编程中最容易忽略的10个常见问题分别有哪些

本篇文章给大家分享的是有关Java编程中最容易忽略的10个常见问题分别有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在Java编码中,我们容易犯一些错误,也容易疏忽一些问
2023-06-17

商城网站建设优化最容易忽略的问题有哪些

这篇文章主要介绍了商城网站建设优化最容易忽略的问题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。第一、商城网站中的商品标题商城网站中的内容一般都是商品,每一个商品都会有
2023-06-10

Python初学者容易忽略的一些细节

1、Python中当让给变量1赋值上变量2的值时,变量1直接指向值在内存中存储的地址,即变量1存储的是变量2的值而不是指向变量 2、"""的用法1.多行注释2.多行输出3、格式化输出的三种方法1.字符串拼接(占用内存大慎用)2.%控制输出.
2023-01-31

Python面向对象编程最容易忽视的知识点有哪些

这篇文章主要介绍“Python面向对象编程最容易忽视的知识点有哪些”,在日常操作中,相信很多人在Python面向对象编程最容易忽视的知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python面向对
2023-06-02

Win7系统中容易忽略的四个实用功能

现在相信大多数朋友都用上Win7了,那么您是否对Win7已经很熟悉了呢?相信不少朋友的回答都是肯定的。但Win7所隐藏的一些新功能,大家是否真正注意过呢?接下来,笔者就给大家介绍几个Win7容易被人忽略且很实用的新功能。即时帖,随意记
2023-05-29

部署Kubernetes应用容易忽略的细节有哪些

这篇文章主要介绍“部署Kubernetes应用容易忽略的细节有哪些”,在日常操作中,相信很多人在部署Kubernetes应用容易忽略的细节有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”部署Kuberne
2023-06-27

使用Dedecms中七个容易忽略的安全细节介绍

随着cms的流行起来,越来越多的网友开始加入到个人站长的行业里,或许不少网友认为,只要买个域名,租个空间,随后解析域名,随后FTP上传程序,程序安装以后便可以发布内容了,发布内容了便开始到处做外链了,做外链了便是真正的站长了。 只是,做站长
2022-06-12

网站建设中容易忽略的重要细节有哪些

小编给大家分享一下网站建设中容易忽略的重要细节有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、网站链接不连贯有一些网站的技术人员,在进行网站建设的时候,或
2023-06-10

网站建设过程中容易被忽略的元素是什么

网站建设过程中容易被忽略的元素是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。网站的定位站长们都知道,在跟客户谈单时,客户会提出一些无厘头的要求,有的只是想
2023-06-10

Docker容器下的Mysql,设置表名忽略大小写

在阿里的ECS上使用Docker安装mysql,默认拉取的版本是最新版本的,通过挂载配置和数据的方式运行容器,docker run -p 3306:3306 --name mysql-ci -v /usr/local/docker/mysql/conf.d:/
Docker容器下的Mysql,设置表名忽略大小写
2017-12-30

Web测试中的UI测试详解:容易忽略的14个测试点汇总

有软件的地方就有界面,就会有界面测试。界面测试是软件测试中,最多,最繁琐,最简单的测试。尤其在本地化测试(多国语言测试)中,有很多的界面测试。用户界面测试简称UI测试,测试用户界面的功能模块的布局是否合理,整体风格是否一致和各个控件的放置位
2023-06-05

编程热搜

目录