MySQL性能问题
一、性能因素影响性能问题
二、虚拟机配置2.1 虚拟机黑屏2.2 虚拟机网络连接不上2.3 配置IP2.4 Xshell连接2.5 虚拟机安装jdk
三、Linux查询命令3.1 ps命令3.2 top命令3.3 vmstat命令
四、Linux管道机制五、mysql性能查询命令
一、性能因素影响
性能问题
性能问题:
硬件层面:
CPU、内存、硬盘、网络、I/O、显卡
软件层面:
产品原因:
代码、SQL、算法
其他软件原因:
数据库、中间件、操作系统
意识层面:
测试人员、一线人员、代码实现、产品经理、需求设计
业务层面:
实施方案、业务流程重组、需求定位
商业需求:
案例:
要求:论坛项目中去统计帖子数量 附加要求:实时更新
操作:在mysql中 -- select count(*) from '文章表';
分析:在论坛中,数据量大可能会达到千万级,innodb存储引擎顶不住
每次帖子/文章发布的时候,在统计表中结果+1,所以需要改变要求
实时更新 =》延迟更新(一天)改为定时任务 给innodb加上where条件
数据表设计:
innodb存储引擎是全表扫描,myisam存储引擎有计数器所以查询快
尽量不要有太大的字段,尽量要小
系统架构:
技术选型 -- 缓存
数据的存储 -- 超文本数据、二进制多媒体文件(图片,视频,音频等)varchar字段来存储路径
影响:
硬件 > 业务 > 数据库设计与sql(代码)
问题:
对于用户来说,响应时间10s,1分钟(时间过长,死机)
对于程序员来说:一个程序执行时间太长
性能优化的目的:
对于用户来说:体验好,响应速度快,处理快,结果正确
对于程序员来说:程序执行顺畅
问题原因:
硬件:磁盘(I/O、寻址)、内存、cup等
软件:mysql,算法,代码,程序
业务:
系统架构:事务里面,有很多的数据读写
二、虚拟机配置
2.1 虚拟机黑屏
解决办法:
2.1.1 以管理员身份启动CMD(命令行模式)
2.1.2 重启虚拟机网络 -- netsh winsock reset
2.1.3 重启电脑(虚拟机不要关闭,直接重启)
链接地址
2.2 虚拟机网络连接不上
原因:
虚拟网络的服务没有打开
解决办法:
2.2.1 win+R 输入services.msc -- 打开服务管理 (5个)
2.2.2 把带有 VM 的改成自动 、启动、应用、确定
2.3 配置IP
vi /etc/sysconfig/network-scripts/ifcfg-ens33 ONBOOT=no 改成 ONBOOT=yes ,再回车 写上 ZONE=public IPADDR = 获取IPADDR的值, centos的ip地址 处于起始和结束之间就可以 NETMASK=255.255.255.0 # 子网掩码 GATEWAY=192.168.182.2 网关ip 编辑完成后 按 esc 输入 :wq 保存并退出。 systemctl restart network – 重启 ip addr – 查看虚拟机IP地址
2.4 Xshell连接
点击新增
名称:填写名称(自己随便写)
主机:虚拟机IP地址
点击用户身份验证 :
用户名 虚拟机用户名
密码 虚拟机密码
点击确定
点击接受并保存
2.5 虚拟机安装jdk
tar
-zxvf jdk
-8u20
-linux
-x64
.tar
.gz
--解压jdk
tar -zxvf 用于解压.tar.gz 后缀结尾的
tar -xvf 用于解压.tar后缀结尾的
mv jdk1
.8
.0_20
/usr
/local
/java
-- 把解压后的文件移动到
/usr
/local
/java里面去
配置环境变量
vi
/etc
/profile
-- 在文件末尾配置
export JAVA_HOME=
/usr
/local
/java
export CLASSPATH=
.:$
{JAVA_HOME
}/jre
/lib
/rt
.jar:$
{JAVA_HOME
}/lib
/dt
.jar:$
{JAVA_HOME
}/lib
/tools
.jar
export PATH=
$PATH:$
{JAVA_HOME
}/bin
保存并退出
source
/etc
/profile
-- 开启环境变量
java
-version
-- 查看Java的版本
三、Linux查询命令
3.1 ps命令
a 显示所有进程
-a 显示同一终端下的所有程序
-A 显示所有进程
c 显示进程的真实名称
-N 反向选择
-e 等于“-A”
e 显示环境变量
f 显示程序间的关系
-H 显示树状结构
r 显示当前终端的进程
T 显示当前终端的所有程序
u 指定用户的所有进程
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程
-C<命令> 列出指定命令的状况
--lines<行数> 每页显示的行数
--width<字符数> 每页显示的字符数
--help 显示帮助信息
--version 显示版本显示
状态 STAT:
S:休眠状态
s: 有子进程存在
D:进程不可中断
R:进程正在运行中
T: 进程已经停止了
Z:僵尸进程
W: 内存交换(内核2.6以后就没有了)
X: 死掉的进程
<:优先级高
N:优先级低
+:后台运行
在命令中:
%CPU 表示cpu(代表每个处理器的整体使用率)的使用率,如果持续一段时间里CPU的使用率大于80%,这就可能表
名CPU出现瓶颈。
%mem 表示内存的占用率 stat中的参数意义: ` D 不可中断 Uninterruptible(usually IO) R 正在运行,或在队列中的进程
S 处于休眠状态T 停止或被追踪 Z 僵尸进程 W 进入内存交换(从内核2.6开始无效) X 死掉的进程
高优先级 n 低优先级 s 包含子进程
常用ps命令:
ps -aux -- 主要是查看CPU以及内存使用率
ps -ef |grep mysqld -- 和上一个差不多但没有他详细
kill -9 进程id -- 杀死进程
3.2 top命令
top第一行信息: top - 21:51:44 up 24 min, 2 user, load average: 0.00, 0.01, 0.04 21:51:44 表示系统运行的当前时间 up 24 min 表示系统运行时间 2 user 表示登录用户的数量。 load average: 0.00, 0.01, 0.04 表示系统负载,既任务队列的平均长度,三个数值分别1分钟,5分钟,15分钟 到现在的平均值。
第2,3行两汉分别表示进程和CPU的性能的一些信息
Task: 103 total, 1 running, 102 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
统计信息的含义:
Tasks: 101 total 表示进程总数
1 running 正在运行的进程数量
100 sleeping 睡眠的进程数量
0 stopped 停止的进程数量
0 zombie 表示僵尸进程数量
0.0 us 表示用户空间占用CPU的百分比(如果用户时间值很高,表明系统正在执行实际的工作)
0.0 sy(表示内核空间占用CPU的百分比,包括终端,(系统时间值持续很高表名网络或驱动器堆栈可能存在瓶颈。通 常 ,系统只会花费很少时间在内核时间 上)
0.0 ni 表示用户进程空间改变过优先级的进程占用CPU的百分比
100.0 id 表示空闲cpu(这个值越大表明系统CPU的负荷越小)
0.0 wa I/O等待 表示等待输入输出的cpu(等待I/O操作所需要的CPU时间总合,系统不应该花费过多的时间等待I/O 操作,否则你应该检查一下I/O子系统各方面的性能)
top 显示出现的每个列的含义分别为:
PID: 进程描述符
USER: 进程的拥有者
PRI:进程的优先级
NI: nice level
SIZE: 进程拥有的内存(包括code segment + data segment + stack segment)
RSS: 物理内存使用
VIRT(virtul memory usage): 进程需要的虚拟内存大小
RES(resident memory usage): 常驻内存
SHARE: 和其他进程共享的物理内存空间
STAT:进程的状态,有 S=sleeping,R=running,T=stopped or traced,D=interruptible sleep(不可中断的 睡眠状态),Z=zombie。
%CPU: CPU使用率
%MEM: 物理内存的使用
TIME: 进程占用的总共cpu时间
COMMAND:进程的命令
3.3 vmstat命令
vmstat
r列表:是可运行进程的数量
b列表:是阻塞进程的数量
内存性能优4个报告虚拟内存如何使用的字段
swpd已经使用的交换空间的数量
free 自由RAM数量
buff 缓存使用的RAM的数量
cache 文件系统缓存使用的RAM数量
swap交换字段进行详细说明
si 表示从磁盘分页到内存的数量
so 表示从内存分页到磁盘的数量。
其余相关的系统命令:sar、iostat、netstat、free等
四、Linux管道机制
命令1|命令2|命令3
注意:
1.管道命令只处理前面一个命令的输出,不处理错误输出
2.管道命令右边命令,必须能够接受标椎输入命令才行
命令1查询结果为 "3 2 1"
命令2获取到命令1的查询结果 并根据自己的查询条件输出结果为 "2 1"
命令3获取到命令2的查询结果 并根据自己的查询条件输出结果为 "1"
五、mysql性能查询命令
用来查看mysql在运行过程中的属性状态
show status:
show status like
"%变量%";
查看会话状态
-- 查看当前会话情况
show status like
'Com_%';
-- 查看全局会话情况
show global status like
'Com_%';
-- 查看针对innodb存储引擎状态的统计
show global status like
'Innodb_%';
-- 查看视图连接MySQL服务器次数
show global status like
'connections';
-- 查看服务器工作时间
show global status like
'uptime';
-- 查看锁使用情况
show global status like
'innodb_row_lock%';
innodb_flush_log_at_trx_commit
-- 事务提交
commit
-- 每执行一次
0: 先把数据和重做日志放在内存中,在一定时间后刷新到磁盘中去(性能最好,安全性不高) 1: 直接把数据和重做日志刷新到磁盘中(相对最稳妥的) 2: 先刷新重做日志,再刷新磁盘(性能差,安全性高)
show processlist:
processlist 命令的输出结果显示了有哪些线程在运行,可以帮助识别出有问题的查询语句,两种方式使用这个命令。
show processlist
;
> 查看mysql系统变量:
--查看当前session级别的隔离方式
show variables
;
-- 查看isolation帮助 help isolation
show variables like
'%isolation%';
-- 局部修改
set session transaction isolation level READ COMMITTED
;
show session variables like
'%isolation%';
-- 全局修改
show global variables like
'%isolation%';
set global transaction isolation level READ COMMITTED
;
show variables like
"%isolation%"; -- 查询事务的隔离级别
show variables\G
; -- 查询关于mysql系统变量
对mysql的影响:
数据库设计 > 数据库表的设计 > sql语句的查询 > 程序 > 硬件
六星教育--2008期mysql优化--李建宇