进行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_中各事件的处理数及比例

__ Questions ___________________________________________________________

Total 4.12G 181.3/s

  QC Hits 2.93G 129.0/s %Total: 71.14

  DMS 714.48M 31.4/s 17.34

  Com_ 563.75M 24.8/s 13.68

  -Unknown 186.61M 8.2/s 4.53

  COM_QUIT 97.48M 4.3/s 2.37

Slow 3 s 49.32k 0.0/s 0.00 %DMS: 0.01 Log: ON

DMS 714.48M 31.4/s 17.34

  SELECT 536.16M 23.6/s 13.01 75.04

  DELETE 66.80M 2.9/s 1.62 9.35

  UPDATE 61.78M 2.7/s 1.50 8.65

  INSERT 49.34M 2.2/s 1.20 6.91

  REPLACE 401.78k 0.0/s 0.01 0.06

Com_ 563.75M 24.8/s 13.68

  show_fields 214.45M 9.4/s 5.20

  set_option 194.83M 8.6/s 4.73

  change_db 144.83M 6.4/s 3.51



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行进行增删改查的数据量

__ InnoDB Data, Pages, Rows ____________________________________________

Data

  Reads 5.93M 0.3/s        #整个innodb引擎完成所有的数据读取次数,不是数据赢取的字节数    

  Writes 23.12M 1.0/s     #也是统计写的次数

  fsync 14.65M 0.6/s        #刷新的次数

  Pending                       #读、写、刷新的等待次数

    Reads 0

    Writes 0

    fsync 0

Pages

  Created 2.04M 0.1/s

  Read 21.45M 0.9/s

  Written 17.36M 0.8/s

Rows

  Deleted 62.97M 2.8/s

  Inserted 283.26M 12.5/s

  Read 4.56T 200.7k/s

  Updated 34.59M 1.5/s