前言

通过上次发布的业务优化不是一步到位的有不少网友问我许多关于业务优化和Web方面的问题。在这里表示感谢和支持。在期间有些回答不到位的还请谅解,并且个人经验有限。

百牛信息技术bainiu.ltd整理发布于博客园

新的问题

其中有一位网友说看了文章,并且实践在自己的项目上,效果还是不错的。但是有一个场景,表现的效果不是很好,或者说效果基本没有什么改变。

在相互的沟通了一下,了解他们的场景,以及相关表结构。之后给予了相关建议,听说效果还不还行。就是让开发有些不满意 ^_^。

题外话:其实可以请开发吃顿饭,增进感情 ^_^。

下面我使用演示的方式将这个场景进行分析和优化(该场景并非网友的)。

场景讲解

每个用户都可以查看商品的列表,在商品列表点击商品描述的时候,会弹出一个窗口并显示。详细的商品介绍的信息。表结构如下:

 
1
2
3
4
5
6
CREATE TABLE goods(
goods_id INT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
name VARCHAR(30) NOT NULL DEFAULT '' COMMENT '商品名称',
descript VARCHAR(2000) NOT NULL DEFAULT '' COMMENT '商品描述',
PRIMARY KEY(goods_id)
) COMMENT = '商品表';

刚开始的时候查询如下:

 
1
SELECT goods_id, name, descript FROM goods LIMIT 0, 50;

通过执行上面SQL一次新就找出了50条数据,初步算了一下一次性需要传输的数据量大概 100K,可想而知当多人同时访问的时候,有限的带宽只能接受较少的请求和并发。

改进的查询如下

瞄过业务不是一步到位的的网友估计会把这个请求拆成两个请求,以至于达到优化的目的。如下:

第一个请求:只获取商品的基本信息(快)

 
1
SELECT goods_id, name FROM goods LIMIT 0, 50;

第二个异步请求:通过获取的goods_id集合来获取商品的描述descript

 
1
SELECT goods_id, descript FROM goods WHERE goods_id IN(上面获得的goods_id集合)

确实是按之前的优化方法进行优化了,可以为啥性能还是没改善呢?

慢的原因

从上面可以看出,第一个查询确实能很快的放回和传输数据,这是毋庸置疑的。

我们再来看看第二个请求,它查出的数据大小其实和之前一次性查出的数据大小其实没有很大的差别。问题就在这里了。

如果是指一个人在查询,可以感觉确实有快很多。因为第一个请求的数据会很快的展现在前端,第二个异步请求的慢其实让用户感觉不到。

但是如果人多了,并发请求高了。异步请求多了,那数据库不断的获取传输数据。这样数据库不断的在IO上,从而影响了并发。所以也会感觉慢。这就相当于优化和没优化是一样的。

总的原因就是实时加载了哪些看上去实时,实际不需要实时加载的数据descript

#### 分析客户和产品的需求

1、大多数客户并不需要每次都查看所有的商品的描述,只想了解个别自己感兴趣的商品描述。

Tips:如果在开发或产品上得不到这样的答案,可以自己去范围日志里面分析比例。访问商品列表和访问商品详情的请求比例。

2、根据客户和产品的需求,他们需要一眼就能大概了解每个商品的大致描述。

解决思路

知道了慢的原因,并且了解了客户的基本需求。解决办法就是对描述数据进行拆分并且限制请求

将第二个异步请求,转化为被动的异步请求。也就是说我们在用户点击查看详情的时候在去一个个异步的去加载商品的详情信息。

将一张表拆分成两张表,如下:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 主商品信息表
CREATE TABLE goods(
goods_id INT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
name VARCHAR(30) NOT NULL DEFAULT '' COMMENT '商品名称',
introduce VARCHAR(30) NOT NULL DEFAULT '' COMMENT '商品简介',
PRIMARY KEY(goods_id)
) COMMENT = '商品表';
-- 商品描述表
CREATE TABLE goods_descript(
goods_descript_id INT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
goods_id INT NOT NULL COMMENT '商品ID',
descript VARCHAR(2000) NOT NULL DEFAULT '' COMMENT '商品描述',
PRIMARY KEY(goods_descript_id),
UNIQUE KEY udx$goods_id(goods_id)
) COMMENT = '商品描述表';

上面我们将商品的描述信息拆分到了另外一个表中。并且在主信息表goods中添加一个商品简介字段introduce

用户在保存信息的时候可以编写一些商品的一些简要介绍,或者从商品描述中截取一部分信息到商品简介中。

最后的体验

通过上面的改造后我们的SQL很简单。

第一步:用户查询商品列表只需要个简单的SQL就完成了,如下:

 
1
SELECT goods_id, name, introduce FROM goods LIMIT 0, 50;

第二步:有需要查询商品描述的用户也只需要一个简单的SQL,如下:

 
1
SELECT goods_id, descript FROM goods WHERE goods_id IN(上面获得的goods_id)

Tips:第二步是被动的,当用户点击的时候才进行异步加载商品信息。并只加载当前点击的商品的描述

要被开发骂了

其实我们还可以进一步优化,就是如果对已经异步加载的商品描述,使用前端技术保存在页面中并隐藏起来。这样如果用户再次点击的时候,只需要获取前端页面隐藏的商品描述进行展现,并不需要再次请求。这样就减小了后端的压力了。

上面的做法就需要增加开发人员的工作量了。

Tips:一般前端隐藏技术可以使用 <input type="hidden" value="商品描述隐藏在这里">

祝大家工作愉快。

MySQL-业务优化——说的就是变的更多相关文章

  1. Mysql性能优化三(分表、增量备份、还原)

    接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ...

  2. 50多条mysql数据库优化建议

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的.在非群集索引下,数据在物理上随机存 ...

  3. php代码优化,mysql语句优化,面试需要用到的

    首先说个问题,就是这些所谓的优化其实代码标准化的建议,其实真算不上什么正真意义上的优化,还有一点需要指出的为了一丁点的性能优化,甚至在代码上的在一次请求上性能提升万分之一的所谓就去大面积改变代码习惯, ...

  4. 解开发者之痛:中国移动MySQL数据库优化最佳实践(转)

    开源数据库MySQL比较容易碰到性能瓶颈,为此经常需要对MySQL数据库进行优化,而MySQL数据库优化需要运维DBA与相关开发共同参与,其中MySQL参数及服务器配置优化主要由运维DBA完成,开发则 ...

  5. CentOS服务器下对mysql的优化

    原文链接: CentOS服务器下对mysql的优化 一.mysql的优化思路 mysql的优化分为两方面: 1. 服务器使用前的优化 2. 服务使用中的优化 二.mysql的基础优化步骤 1. 硬件级 ...

  6. 百万行mysql数据库优化和10G大文件上传方案

    百万行mysql数据库优化和10G大文件上传方案 最近这几天正在忙这个优化的方案,一直没时间耍,忙碌了一段时间终于还是拿下了这个项目?项目中不要每次都把程序上的问题,让mysql数据库来承担,它只是个 ...

  7. mysql语句优化总结(一)

    Sql语句优化和索引 1.Innerjoin和左连接,右连接,子查询 A.     inner join内连接也叫等值连接是,left/rightjoin是外连接. SELECT A.id,A.nam ...

  8. Mysql 索引优化分析

    MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...

  9. 知识点:Mysql 索引优化实战(3)

    知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 索引原理知识回顾 索引的性 ...

  10. 涨姿势:Mysql 性能优化完全手册

    涨姿势:Mysql 性能优化完全手册 深入理解MySQL服务器架构 客户端层 MySQL逻辑架构整体分为三层,最上层为客户端层,诸如:连接处理.授权认证.安全等功能均在这一层处理. 中间层 MySQL ...

随机推荐

  1. 【数学】codeforces B. The Golden Age

    http://codeforces.com/contest/813/problem/B [题意] 满足n=x^a+y^b的数字为不幸运数字,a,b都是非负整数: 求闭区间[l,r]上的最长的连续幸运数 ...

  2. 事件和委托:第 5 页 委托、事件与Observer设计模式

    原文发布时间为:2008-11-01 -- 来源于本人的百度文章 [由搬家工具导入] 委托、事件与Observer设计模式 范例说明 上面的例子已不足以再进行下面的讲解了,我们来看一个新的范例,因为之 ...

  3. 123. Best Time to Buy and Sell Stock III ~~

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  4. jxls使用模版导出Excel

    /**     * 使用模版导出Excel     */    @SuppressWarnings({ "unchecked", "deprecation" } ...

  5. SystemInformationRequestHandlers

    SystemInformationRequestHandlers - Solr Wiki Search: Solr Wiki Login SystemInformationRequestHandler ...

  6. navicat 无法连接到腾讯云Mysql

    远程连接进入服务器 远程连接进入服务器之后,输入命令mysql -u root -p 之后输入mysql密码,进入mysql 命令环境 设置开启远程登录 GRANT ALL PRIVILEGES ON ...

  7. Linux 的 Socket IO 模型

    前言 之前有看到用很幽默的方式讲解Windows的socket IO模型,借用这个故事,讲解下linux的socket IO模型: 老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系. 他 ...

  8. protobuf 之 MessageLite 接口摘录

    class LIBPROTOBUF_EXPORT MessageLite { public: inline MessageLite() {} virtual ~MessageLite(); // Ba ...

  9. Highcharts:X轴分组堆叠图

    在设计一个项目中的数据展示页面时.想要设计双X轴,一个轴显示须要的项.一个轴对这些项进行分组.效果如图: Highcharts自带双X轴展示方式.可是效果不是太理想.调整起来也会麻烦些 看到Highc ...

  10. 给工作赋予的新意义——Leo鉴书78

    现代社会学三大奠基人有两位名字里有"马克思",他们都是德国人.当中一位就是写<资本论>的卡尔•马克思,另一位就是<新教伦理与资本主义精神>的作者马克思•韦伯 ...