MySQL进阶篇(01):基于多个维度,分析服务器性能
本文源码:GitHub·点这里 || GitEE·点这里
一、服务器性能简介
1、性能定义
服务器性能优化是一项非常艰巨的任务,当然也是很难处理的问题,在写这篇文章的时候,特意请教下运维大佬,硬件工程师,数据库管理,单从自己的实际开发经验来看,看待这个问题的角度起码是不全面的。
补刀一句:在公司靠谱少撕逼,工程师这个群体是很好交朋友的,互相学习一起进步,升职加薪他不好吗?
服务性能定义:完成一个任务或者处理一次接口请求所需要的时间,这个时间是指响应完成时间,即请求发出,到页面响应回显结束,这是看待性能问题的基本逻辑。
2、分析性能
服务的基本过程一般如下图,这是一张最简单的前后端分离,加一台数据库存储的流程,但是想要说明一个复杂的逻辑。

从页面请求,到获取完整的响应结果,这个过程每个环节都可能导致性能问题,抛开网络,硬件,服务器,MySQL存储这些核心客观因素,单是下面这行代码就可以秒掉很多人的努力。
Thread.sleep(10000); // 仿佛整个世界都安静了。
影响性能的因素很多,一般说性能优化会从下面几个方面考虑:
- 网络传输,比如私有云和公有云的交互,接口传输内容过大;
- 应用服务,接口设计是否最简,没有逻辑问题,架构设计是否合理;
- 存储服务,MySQL的查询写入,表设计是否合理,连接池配置是否合理;
- 硬件设施,CPU和内存的利用是否在合理区间,缓存是否合理;
这些问题每个处理起来都是非常耗费时间,且对人员的要求相对较高,不说一定要到达专家水平,起码性能问题出现时候,基本的意识要有。
二、MySQL执行机制
基于上述流程图,MySQL性能分析主要从下面几个方面切入,基本方向就不会偏。
1、连接池配置
查看默认最大连接数配置:
SHOW VARIABLES LIKE 'max_connections';
最小连接数是连接池一直保持的会话连接,这个值相对好处理许多,评估服务在正常状态下需要多少会话连接。
最大连接数服务器允许的最大连接数值,这个参数的设计就比较飘逸,需要对高并发业务有把控,且要分析SQL性能,和CPU利用率(基本上是70%-85%),想获得这一组参数,可是相当不容易,需要测试精细,配合运维进行服务监控记录,开发不断优化,可能要分库分表,或者集群,拆服务分布式化等一系列操作,最终才能得到合理处理逻辑,当然这样费心对待的都是核心业务,一般的业务也就是经验上把控。
2、SQL执行过程
MySQL解析器识别SQL的基本语法,生成语法树,然后优化器输出SQL可执行计划,非常复杂的流程。

- 客户端发送请求到MySQL服务器;
- 如果执行查询,会检查缓存是否命中;
- 服务端进行SQL解析,预处理,最后优化器生成执行计划;
- 根据执行计划调用存储引擎API执行;
- 返回客户端处理结果;
补刀一句:这也就是为什么现在接口提倡最简化设计,或者接口拆分,分步执行,不要问这样会不会多次请求,给网络造成压力,这都5G时代了。
3、逻辑总结
总结一句话:分析是否存在MySQL服务的性能问题,需要考量是不是服务配置问题,或者SQL编译过程问题,导致大量等待时间,还是SQL执行有问题,或者查询数据量过大导致执行过程漫长。
补刀一句:MySQL性能问题的基本原因很简单,数据量不断变大,服务器承载不住。作为开发,这是面对数据库优化的根本原因。
三、执行语句分析
1、基本描述
上面几个方面都是在说明面对服务性能问题时,意识上要清楚的边界,作为开发实际上要面对两个直接问题:表设计,SQL语句编写,大部分的开发都被这两个问题毒打过。
2、表结构设计
表设计:表设计关系到数据库的各个方面知识:数据类型选择,索引结构,编码,存储引擎等。是一个很大的命题,不过也遵循一个基本规范:三范式。
规范的表结构,合适的数据类型可以降低资源的占用,索引可以提高查询效率,存储引擎更是关系到事务方面的问题。
表的结构的逻辑清晰,是后续查询和写入的基本条件,结构过大,会出现很多索引,分表结构多,带来很多连接查询,同样会把开发感觉按在地上。这就涉及到一个玄学:开发要根据经验和因素,权衡表结构设计。
补刀一句:如果你去问3.5年的开发,最想写什么业务,他肯定会说单表的增删改查,为什么?因为这类任务是不会排期给他的。
3、数据更新
假设在表结构符合逻辑的情况下,数据更新(增删改)操作一般情况下不会出现较大问题,遵循几个基本原则。
- 数据量大的写入,执行批量操作,占用连接少;
- 删除和更新要考虑锁定的粒度,不要导致大范围锁定;
- 经常执行删除操作,要考虑内存碎片问题;
- 批量操作可以基于应用层面使用多线程处理;
4、数据查询
查询是开发中最常面对的问题,针对查询的规范也是特别多,确实查询也是最容易出错的环节。但是影响查询的因素很多,可能很多情况下查询只是背黑锅:
- 表设计规范,减少各种关联,子查询;
- 列类型规范,数据值规范,Null和空处理;
- 索引结构和使用规范,对查询性能影响最大;
- 存储引擎选择合适,直接影响锁定粒度大小;
- 外键关联导致表强行耦合,最讨厌的一个功能;
SQL在执行的时候,如果性能很差,还需要基于MySQL慢查询机制进行分析,查看是否出现磁盘IO,临时表,索引失效等各种问题。
四、模块总结
上述的描述可能感觉有点乱,但是整体上看,就分为下面三个模块:
- 应用服务流程化分析,判断瓶颈出现环节;
- 熟悉MySQL基本机制,分析等待和执行时间;
- MySQL的表结构设计和SQL执行优化;
这篇文章只是笼统描述一下服务性能的问题,重点还是想陈述一个基本逻辑:具备服务性能问题分析的意识,且意识的边界相对全面,不要只盯着某个方面思考。
补刀一句:因为文章的分类是MySQL模块,所以重点的描述也在MySQL层面。实际情况中,任何层面都可能导致性能问题。
五、源代码地址
GitHub·地址
https://github.com/cicadasmile/mysql-data-base
GitEE·地址
https://gitee.com/cicadasmile/mysql-data-base

推荐阅读:
MySQL数据库基础
| 序号 | 文章标题 |
|---|---|
| 01 | MySQL基础:经典实用查询案例,总结整理 |
| 02 | MySQL基础:从五个维度出发,审视表结构设计 |
| 03 | MySQL基础:系统和自定义函数总结,触发器使用详解 |
| 04 | MySQL基础:存储过程和视图,用法和特性详解 |
| 05 | MySQL基础:逻辑架构图解和InnoDB存储引擎详解 |
| 06 | MySQL基础:事务管理,锁机制案例详解 |
| 07 | MySQL基础:用户和权限管理,日志体系简介 |
MySQL进阶篇(01):基于多个维度,分析服务器性能的更多相关文章
- MySQL进阶篇(02):索引体系划分,B-Tree结构说明
本文源码:GitHub·点这里 || GitEE·点这里 一.索引简介 1.基本概念 首先要明确索引是什么:索引是一种数据结构,数据结构是计算机存储.组织数据的方式,是指相互之间存在一种或多种特定关系 ...
- MySQL进阶篇(03):合理的使用索引结构和查询
本文源码:GitHub·点这里 || GitEE·点这里 一.高性能索引 1.查询性能问题 在MySQL使用的过程中,所谓的性能问题,在大部分的场景下都是指查询的性能,导致查询缓慢的根本原因是数据量的 ...
- 【目录】mysql 进阶篇系列
随笔分类 - mysql 进阶篇系列 mysql 开发进阶篇系列 55 权限与安全(安全事项 ) 摘要: 一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysq ...
- (6)MySQL进阶篇SQL优化(MyISAM表锁)
1.MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源 (如 CPU.RAM.I/O 等)的抢占以外,数据也是一种供许多用户共享的资源.如何保证数 据并 ...
- 走进Vue时代进阶篇(01):重构电商购物车模块
前言 从这篇文章开始,我准备给大家分享一些关于Vue.js这门框架的技巧性系列文章,正好我们公司项目中也用到了Vue.所以,教是最好的学.进阶篇比较适合于二三线城市,还在小厂打拼的童鞋们.欢迎你们跟着 ...
- (4)MySQL进阶篇SQL优化(常用SQL的优化)
1.概述 前面我们介绍了MySQL中怎么样通过索引来优化查询.日常开发中,除了使用查询外,我们还会使用一些其他的常用SQL,比如 INSERT.GROUP BY等.对于这些SQL语句,我们该怎么样进行 ...
- mysql优化篇(基于索引)
在上一篇文章:Mysql索引(一篇就够le) 中介绍了索引的基本使用,分类和原理,也强烈建议先读Mysql索引(一篇就够le),然后继续本文的阅读 我们也知道mysql的优化可以从很多的方面进行,比如 ...
- mysql 开发进阶篇系列 2 SQL优化(explain分析)
接着上一篇sql优化来说 1. 定位执行效率较低的sql 语句 通过两种方式可以定位出效率较低的sql 语句. (1) 通过上篇讲的慢日志定位,在mysqld里写一个包含所有执行时间超过 long_q ...
- (7)MySQL进阶篇SQL优化(InnoDB锁-事务隔离级别 )
1.概述 在我们在学习InnoDB锁知识点之前,我觉得有必要让大家了解它的背景知识,因为这样才能让我们更系统地学习好它.InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION ...
随机推荐
- sql05
1.Ado.net Ado.net是一组由微软提供的使用C#操作数据库的类库 2.连接 首先引入: using System.Data.SqlClient; 需要使用连接字符串进行连接 using S ...
- vue——一个页面实现音乐播放器
请忽略下面这段文字年关将至,时间好歹又多出了些许.却不敢过度消遣.岁月未曾饶过我,我亦不想饶过岁月.且将它塞得膨胀,让这一年看似加更充实.不曾料想我一个爱些风花雪月.研墨行歌之人,却做起了碼农这一行当 ...
- 【渗透】node.js经典问题
1.循环问题 当循环调用 require() 时,一个模块可能在未完成执行时被返回.例如以下情况:a.js: exports.done = false; const b = require('./b. ...
- CSS 图像拼合技术(雪碧图)
1.css 图像拼合 图像拼合就是单个图像的集合. 有许多图像的网页可能需要很长的时间来加载和生成多个服务器的请求. 使用图像拼合会降低服务器的请求数量,并节省带宽. 代码如下: <!docty ...
- 判断某个点是否在某个view上
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObjec ...
- Hadoop fs 基础命令
操作hdfs的基本命令 在hdfs中,路径需要用绝对路径 1. 查看根目录 hadoop fs -ls / 2. 递归查看所有文件和文件夹 -lsr等同于-ls -R hadoop fs -lsr / ...
- Python3基础语法和数据类型
Python3基础语法 编码 默认情况下,Python3源文件以UTF-8编码,所有字符串都是unicode字符串.当然你也可以为原码文件制定不同的编码: # -*- coding: 编码 -*- 标 ...
- ubuntu16.04 + caffe + SSD + gpu 安装
昨天我们买好了硬件,今天我们开始安装caffe了,我本人安装过caffe不下10次,每次都是一大堆问题,后来终于总结了关键要点,就是操作系统. 1. 千万不要用ubuntu17.10来安装, 2. 最 ...
- DataFrame简介(一)
1. DataFrame 本片将介绍Spark RDD的限制以及DataFrame(DF)如何克服这些限制,从如何创建DataFrame,到DF的各种特性,以及如何优化执行计划.最后还会介绍DF有哪些 ...
- C语言实现简单计算器小项目
昨天刚安装上devc++,半夜想着练练C语言吧 于是就看到实验楼有一个计算器的项目 之前做过一次,这次写的主要是思路 首先我们先从原理思考jia,实现简单的计算器就要具备加减乘除这些,看普通的计算器也 ...