前言

通过上次发布的业务优化不是一步到位的有不少网友问我许多关于业务优化和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. mybatis查询返回null解决方案

    mybatis查询返回null解决方案: 问题:查询出的列与javabean中的字段名不一致. 解决方案: 1.将javabean中的字段改为和查询出的列名一致: 2.将sql加入as改变列名,和ja ...

  2. 【BZOJ1225】求正整数(数论)

    题意:对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m. n<=50000 思路:记得以前好像看的是maigo的题解 n即为将m分解为质数幂次的乘积后的次数+1之积 经检验只需要 ...

  3. BZOJ3126: [Usaco2013 Open]Photo

    n<=200000个点,m<=100000个区间,每个区间有且仅有一个点,求最多几个点,无解-1. http://www.cnblogs.com/Chorolop/p/7570191.ht ...

  4. 《effective C++》:条款36——绝不重新定义继承而来的非虚函数

    (1)当派生类中重写了基类的非虚函数时,这个时候这个函数发生的是静态绑定 下面中的代码中: 定义一个基类B,基类定义了函数fcm,fcm是非虚的函数. 定义一个派生类D,派生类重新定义了fcm. 当用 ...

  5. ibatis中的xml配置文件

    <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMap PUBLIC "-/ ...

  6. Xcode warning: code will never be executed.

    在xcode编译的时候,提示了code will never be executed这个警告.百度了一下,大体的意思是,该代码永远不会执行的意思. 比如: - (void)setMyStyle:(Ad ...

  7. oc温习八:static、extern、const 的了解

    参考文章:http://www.cocoachina.com/ios/20161110/18035.html 1.const 这个单词翻译成中文是“常量”的意思.在程序中我们知道“常量”的值是不能变的 ...

  8. python学习之-- random模块

    random模块random.random():随机打印一个小数random.randint(1,10):随机打印1-10之间的任意数字(包括1和10)random.randrange(1,10):随 ...

  9. [RxJS] Implement RxJS `switchMap` by Canceling Inner Subscriptions as Values are Passed Through

    switchMap is mergeMap that checks for an "inner" subscription. If the "inner" su ...

  10. jquery 动态添加,降低input表单的方法

    html代码例如以下 <html> <tr><button style="margin-left:10px" class="add_fiel ...