好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Mysql数据库优化系列(三)

一、最好的优化 ----- 不查询 ! 这不是开玩笑 . 如果一台服务器出现长时间负载过高/ 周期性负载过大 , 或偶尔卡住 ,如何来处理 ? 大的思路 -------- 是周期性的变化还是偶尔问题 ? 是服务器整体性能的问题 , 还是某单条语句的问题 ? 具体到单条语句 , 这条

一、最好的优化 ----- 不查询 !

这不是开玩笑 .

如果一台服务器出现长时间负载过高 / 周期性负载过大 , 或偶尔卡住 ,如何来处理 ?

大的思路 --------

是周期性的变化还是偶尔问题 ?

是服务器整体性能的问题 , 还是某单条语句的问题 ?

具体到单条语句 , 这条语句是在等待上花的时间 , 还是查询上花的时间 .

唯一的办法 ----- 监测并观察服务器的状态 .

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 脚本


三、实验步骤:


总数据 1300W 以上 ,热数据3W,50 个并发 , 每秒请求 500-1000 次

请求结果缓存在memcache, 生命周期为 60秒,

( 生命周期要结合请求周期来制定 , 比如 3 万条数据随机 , 每秒 1000 条 ,30 秒能走一遍 , 生命周期可设为 60 秒 )

观察 mysql 连接数 , 每秒请求数的周期变化 .



再打开一个窗口

50 个并发, 200000 个总请求


缓存热数据脚本

 

统计脚本status.sh

#!/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 

让memcached后台运行

ab压力测试

在Excel画出图表

解决办法 :

1: 减少无关请求 ( 业务逻辑层面 , 暂不讨论 , 但其实是最有效的手段 )

2: 如果请求数是一定的 , 不可减少的 . 我们要尽量让请求数平稳 , 不要有剧烈波动 .

很多时候 , 不是服务器撑不住总的查询量 , 而是在某个时间段撑不住高峰请求 .

---- 夜间负载低时 , 集中失效 .

短时间内会有波峰 , 但夜间访问量少 , 因此波峰并不剧烈 , 当到上午 10 点左右人多时 , 缓存已经建立了一部分 . 白天时 , 波峰也不剧烈 .

或者让缓存的生命周期在一定范围内随机 , 也可以减缓波峰剧烈的情况

我们把实验中的生命周期由 80 秒 , 改为 [40-120 秒 ], 其他实验条件不变 .

得到如下曲线


可以看出 , 稳定运行后 , 请求在 [1000-1500] 之间波动 ,

而固定缓存周期是 , 请求在 [500-1700] 之间波动 .

查看更多关于Mysql数据库优化系列(三)的详细内容...

  阅读:45次