一、最好的优化 ----- 不查询 ! 这不是开玩笑 . 如果一台服务器出现长时间负载过高/ 周期性负载过大 , 或偶尔卡住 ,如何来处理 ? 大的思路 -------- 是周期性的变化还是偶尔问题 ? 是服务器整体性能的问题 , 还是某单条语句的问题 ? 具体到单条语句 , 这条
一、最好的优化-----不查询
!
这不是开玩笑
.
如果一台服务器出现长时间负载过高 /
周期性负载过大
,
或偶尔卡住
,如何来处理
?
大的思路
--------
是周期性的变化还是偶尔问题
?
是服务器整体性能的问题
,
还是某单条语句的问题
?
具体到单条语句
,
这条语句是在等待上花的时间
,
还是查询上花的时间
.
唯一的办法
-----
监测并观察服务器的状态
.
1:
观察服务器状态
,
一般用如下
2
个命令
Show status; Show processlist;
例
:mysql> show status;
#mysqladmin ext (功能相同)
二、那我们来做一个实验:MySQL周期性波动试验
(一)、实验目的
:
模拟数据库高低峰时的压力波动
,
并会观察绘制波动曲线
(二)、实验思路
:
反复查询数据库并缓存入
memcached,
缓存定期失效
,
(三)、观察记录服务器参数
,
并作图表
.
(四)、实验准备
: nginx+php+memcached+awk+ab
1: index.php (
随机访问
3W
条热数据
,
并储存在
memcached
中
2: memcached (
储存查询结果
)
3: ab
压力测试工具
4: awk
脚本
三、实验步骤:
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
总数据
1300W
以上
,热数据3W,50
个并发
,
每秒请求
500-1000
次
请求结果缓存在memcache,
生命周期为
60秒,
(
生命周期要结合请求周期来制定
,
比如
3
万条数据随机
,
每秒
1000
条
,30
秒能走一遍
,
生命周期可设为
60
秒
)
观察
mysql
连接数
,
每秒请求数的周期变化
.
再打开一个窗口
50
个并发,
200000
个总请求
缓存热数据脚本
统计脚本status.sh
让memcached后台运行
ab压力测试
在Excel画出图表
解决办法
:
1:
减少无关请求
(
业务逻辑层面
,
暂不讨论
,
但其实是最有效的手段
)
2:
如果请求数是一定的
,
不可减少的
.
我们要尽量让请求数平稳
,
不要有剧烈波动
.
很多时候
,
不是服务器撑不住总的查询量
,
而是在某个时间段撑不住高峰请求
.
----
夜间负载低时
,
集中失效
.
短时间内会有波峰
,
但夜间访问量少
,
因此波峰并不剧烈
,
当到上午
10
点左右人多时
,
缓存已经建立了一部分
.
白天时
,
波峰也不剧烈
.
或者让缓存的生命周期在一定范围内随机
,
也可以减缓波峰剧烈的情况
我们把实验中的生命周期由
80
秒
,
改为
[40-120
秒
],
其他实验条件不变
.
得到如下曲线
可以看出
,
稳定运行后
,
请求在
[1000-1500]
之间波动
,
而固定缓存周期是
,
请求在
[500-1700]
之间波动
.
#!/bin/bash
while true
do
mysqladmin -uroot ext|awk '/Queries/{q=$4}/Threads_connected/{c=$4}/Threads_running/{r=$4}END{printf("%d %d %d\n",q,c,r)}' >> status.txt
sleep 1
done