进行MySQL的配置优化,首先必须找出MySQL的性能瓶颈所在;而SHOW STATUS输出的报告正是用来计算性能瓶颈的参考数据。mysqlreport不像SHOW STATUS那样简单的罗列数据,而是对这些参考数据加以融合计算,整理成一个个优化参考点,然后就可以根据这个优化参考点的值以及该点的衡量标准,进行对应调整。
一、安装:
下载mysqlreport工具,直接解压即可,下载地址: http://hackmysql.com/scripts/mysqlreport-3.5.tgz
需要注意的是,mysqlreport是基于perl语言开发,其运行依赖于perl-DBI和perl-DBD-MySQL,所以需要先安装这两个软件。
二、使用:
mysqlreport常用指令:
--user # 指定连接数据库的用户
--password #指定连接数据库的密码
--port #指定端口
--host #指定主机
--sokcet #指定socket文件
--flush-status #显示完报告后,执行"FLUSH STATUS"语句
--outfile #将报告输出至某个文件中
三、输出的报告详细说明
1、基本信息
说明mysql当前的版本,运行的时间,以及当前系统时间
MySQL 5.1.61-log uptime 262 23:51:59 Wed Jul 16 17:58:05 2014 |
2、索引报表
说明mysql当前索引缓冲区的使用率,如果过高,则需要调整key_buffer_size的大小了。write hit及read hit分别说明了写索引和读索引的效率
__ Key _________________________________________________________________ Buffer used 8.67M of 512.00M %Used: 1.69 Current 51.75M %Usage: 10.11 Write hit 34.33% Read hit 99.17% |
3、请求报表
1)第一部分mysql处理的总请求数、平均每秒处理的请求数及请求类型。
QC Hists:是指mysql直接从查询缓存中请求结果的数量,也就是查询缓存的命中率,此值越高越好
DMS:是指数据操作语言,也就是增删改查
Com_:是指mysql处理自身运行所使用的开销
2)第二部分是说明mysql的慢查询数,多长时间的查询被认为是慢查询,是由long_query_time定义的。处理慢查询的比例越低越好,一般不要超过0.05%。慢查询日志建议开启。
3)第三部分详细说明了DMS中各种语句的处理数及比例
4)第四部分则详细说明了Com_中各事件的处理数及比例
|
5、查询与排序
详细说明mysql在查询时的资源消耗
scan展示的是对全表进行扫描的select语句个数
full join则是多表联合查询的次数
__ SELECT and Sort _____________________________________________________ Scan 284.42M 12.5/s %SELECT: 53.05 Range 53.32M 2.3/s 9.95 Full join 3.40M 0.1/s 0.63 Range check 0 0/s 0.00 Full rng join 2.09k 0.0/s 0.00 Sort scan 242.41M 10.7/s Sort range 5.78M 0.3/s Sort mrg pass 0 0/s |
6、查询缓存(只有在开启了查询缓存之后才会出现)
详细说明了查询缓存的内存使用率
Block Fragmnt:是指内存块碎片,如果你有一个返回超小结果的海量查询,默认的块大小(即4KB)可能会导致大量的内存碎片,这个时候,需要降低"query_cache_min_res_unit"的值,比值越大,碎片越多,一般不建议超过10%
Hits/Inserts/Prunes:其中Hits是最重要的,它反应了有多少查询是从查询缓存中直接获得的,Prunes是指每秒删除的碎片时,该值越低越好
insert/prune:是一个波动性的QC指标。一个稳定运行中的QC,insert进QC的查询数量应该大于prune掉的查询数量。而一个不稳定的QC,比值或许是1:1,甚至偏向prune。这说明两个问题:1、QC大小不够;2、mysql试图缓存一切
hit/insert:用来反映QC的有效性。理想情况是:mysql插入一批稳定的查询到QC里,然后源源不断的命中这批结果……所以,如果QC的有效性足够,这个比值应该是偏向hit的。
__ Query Cache _________________________________________________________ Memory usage 68.37M of 128.00M %Used: 53.42 Block Fragmnt 18.92% Hits 2.93G 129.0/s Inserts 353.54M 15.6/s Insrt:Prune 4.17:1 11.8/s Hit:Insert 8.29:1 |
7、表锁
一行是总数,一行是当前数。锁等待对于数据库来说永远是糟糕的事情。第三列的总比值反应了一个综述的情况,无论如何不能高过10%,否则肯定就带来一大堆的索引和慢查询问题!
__ Table Locks _________________________________________________________ Waited 949 0.0/s %Total: 0.00 Immediate 2.01G 88.4/s |
8、表
一行是当前mysql打开的表个数,以及表缓存的使用率,另一行是指mysql运行以来的平均值。这里有两个值比较重要,一个是表的缓存使用率真,如果达到100%,则需要调整"table_open_cahce"的大小;另一个是当前打开表的频率,一般这个值应该小于每秒1次。不过一个负载比较高而又运行的还不错的mysql,可能能达到每秒打开7次表,依然保持100%的表缓存
__ Tables ______________________________________________________________ Open 128 of 128 %Cache: 100.00 Opened 39.85M 1.8/s |
9、数据库连接数
如果最大连接数接近100%,则需要调整"max_connetions"参数,当然如果连接数过大,有可能是慢查询、糟糕的索引、dns解析太慢所导致的问题;每秒连接数,一般小于5个每秒,但通常只要mysql运行正常,就无所谓
__ Connections _________________________________________________________ Max used 547 of 886 %Max: 61.74 Total 97.48M 4.3/s |
7、临时表
mysql可以在内存、磁盘及临时文件上创建临时表,要尽可能避免在磁盘上创建临时表,因为速度最慢,要尽可能在内存中创建,第三行的Table就妈表示在内存中创建临时表的大小,Size是指定的内存允许创建的临时表的大小,可以通过"tmp_table_size"参数来调整其大小
__ Created Temp ________________________________________________________ Disk table 186.19M 8.2/s Table 434.05M 19.1/s Size: 64.0M File 5 0.0/s |
8、线程
当mysql的连接数超过了线程缓存数时,需要增大"thread_cache_size"参数的大小
__ Threads _____________________________________________________________ Running 1 of 1 Cached 7 of 8 %Hit: 99.48 Created 509.01k 0.0/s Slow 0 0/s |
9、中断及流量
__ Aborted _____________________________________________________________ Clients 2.36k 0.0/s Connects 111.05k 0.0/s __ Bytes _______________________________________________________________ Sent 2.56T 112.8k/s Received 892.91G 39.3k/s |
10、Innodb缓冲池
innodb缓冲池的大小可以通过"innodb_buffer_size"参数来调整,作为一个innodb引擎的数据库,请尽可能调大该值
__ InnoDB Buffer Pool __________________________________________________ Usage 1.00G of 1.00G %Used: 100.00 Read hit 100.00% Pages Free 3 %Total: 0.00 Data 62.67k 95.63 %Drty: 0.01 Misc 2861 4.37 Latched 0.00 Reads 4.27T 188.1k/s #innodb缓冲池读性能 From file 4.35M 0.2/s 0.00 #从文件读取 Ahead Rnd 243362 0.0/s #随机读 Ahead Sql 134409 0.0/s #顺序读,只有进行全表扫描的时候才会出现 Writes 3.17G 139.4/s #缓冲池写的数量 Flushes 17.36M 0.8/s #缓冲池的页刷新请求数 Wait Free 0 0/s #空闲等待时间,越小越好 |
11、innodb锁
__ InnoDB Lock _________________________________________________________ Waits 0 0/s #等待某行解锁的累积次数,最好是0次 Current 0 #当前正在等待解锁的行个数,最好是0次 Time acquiring Total 0 ms Average 0 ms Max 0 ms |
12、innodb数据、页、行
第一部分列出了四种类型的数据操作,分别是读、写、刷新、等待
第二部分列出了innodb的页信息,缓冲池中页的创建、读取、写入的数量
第三部分则列出了一些对innodb行进行增删改查的数据量
|