前言

通过上次发布的业务优化不是一步到位的有不少网友问我许多关于业务优化和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. git学习(一)----基础知识

    git是世界上最好用最先进的版本管理系统,那么什么是版本管理系统呢,百度上是这样说的: 举个例子,当你写毕业论文的时候,灵感爆发了修改或者删除了一些内容,但是你还想保留之前的版本,就需要另存为不同的w ...

  2. bzoj2190 [SDOI2008]仪仗队 - 筛法 - 欧拉函数

    作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图).    ...

  3. hdu2294:Pendant

    T<=10组数据问K<=30种珠子每种n<=1e9串成1~n长度的序列共有多少种,mod1234567891. 方程没想到.矩阵不会推.很好. f[i][j]--长度i,j种珠子方案 ...

  4. http的N种请求

    GET通过请求URI得到资源 POST,用于添加新的内容 PUT用于修改某个内容 DELETE,删除某个内容 CONNECT,用于代理进行传输,如使用SSL OPTIONS询问可以执行哪些方法 PAT ...

  5. Swift--Set的了解

    1. 创建和初始化一个空的set var letters = Set<Character>() 或者,如果上下文已经提供了类型信息,例如函数参数或已输入的变量或常量,则可以创建空的集合,其 ...

  6. 洛谷 P1731 [NOI1999]生日蛋糕

    P1731 [NOI1999]生日蛋糕 题目背景 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层 生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M ...

  7. 【Todo】STAR面试法

    今天在面试培训的时候,接触到了STAR面试法. 觉得挺好的,用来准备非技术面试,还蛮全面的.所以可以多了解一下. 可以参考:http://www.hrloo.com/rz/73652.html

  8. webpack-Modules(模块)

    模块(Modules) 在模块化编程中,开发者将程序分解成离散功能块(discrete chunks of functionality),并称之为模块. 每个模块具有比完整程序更小的接触面,使得校验. ...

  9. css 滤镜之Gradient

      CreateTime--2017年12月26日11:09:14 Author:Marydon ie滤镜特效之Gradient 作用: 用于设置渐变背景色 使用条件: IE9及以下版本不支持属性ba ...

  10. Linux经常使用命令(更新中)

    文件类: 1.创建目录:mkdir 例:sudo mkdir test 2.创建空文件:touch 例:sudo touch test.txt 3.删除文件:rm 删除文件不须要确认:rm -f 例: ...