前言

通过上次发布的业务优化不是一步到位的有不少网友问我许多关于业务优化和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. POJ2455 Secret Milking Machine【二分,最大流】

    题目大意:N个点P条边,令存在T条从1到N的路径,求路径上的边权的最大值最小为多少 思路:做了好多二分+最大流的题了,思路很好出 二分出最大边权后建图,跑dinic 问题是....这题是卡常数的好题! ...

  2. 【尺取或dp】codeforces C. An impassioned circulation of affection

    http://codeforces.com/contest/814/problem/C [题意] 给定一个长度为n的字符串s,一共有q个查询,每个查询给出一个数字m和一个字符ch,你的操作是可以改变字 ...

  3. [转]android 如何获取第三方app的sha1值

    对于android 应用的sha1值和md5值的获取,如果是我们自己的应用,不论是获取测试的和正式的都是比较方便的.但是如何去获取别人开发的app的sha1和md5呢,并且我们只有apk有没有相关的文 ...

  4. 转 蓝桥杯 历届试题 大臣的旅费 [ dfs 树的直径 ]

    题解: 求树的直径. 转一篇博客:http://www.cnblogs.com/hanyulcf/archive/2010/10/23/tree_radius.html 树的直径是指树的最长简单路.求 ...

  5. msp430项目编程26

    msp430中项目---串行存储器接口 1.I2C工作原理 2.I2C通信协议 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习

  6. poj3259,简单判断有无负环,spfa

    英语能力差!百度的题意才读懂!就是一个判断有无负环的题.SPFA即可.,注意重边情况!! #include<iostream> //判断有无负环,spfa #include<queu ...

  7. Codeforces 658C Bear and Forgotten Tree 3【构造】

    题目链接: http://codeforces.com/contest/658/problem/C 题意: 给定结点数,树的直径(两点的最长距离),树的高度(1号结点距离其他结点的最长距离),写出树边 ...

  8. [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)

    4540: [Hnoi2016]序列 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1567  Solved: 718[Submit][Status] ...

  9. java collection集合

    集合:用于存储对象的容器.集合中可以存储任意类型的对象,长度可变. 集合和数组的比较 集合和数组都是存储对象的容器,不同的是,数组可以存储基本数据类型(int.short.long.char.Bool ...

  10. MongoDB学习day05--MongDB开启权限验证,创建用户

    一.MongoDB账户权限配置 1.创建超级管理员用户 use admin db.createUser({ user:'admin', pwd:'123456', roles:[{role:'root ...