mysql性能分析

 

作为一个mysqldba管理员,需要清楚地知道目前mysql实例的性能怎么样,压力怎么样。最通常的性能指标是当前有多少的查询,以及多少的更新/插入/删除,但仅仅清楚知道这些还是不能清楚地知道一个mysql实例的压力情况,因为一个全表扫描...

作为一个mysql dba 管理员,需要清楚地知道目前mysql实例的性能怎么样,压力怎么样。最通常的性能指标是当前有多少的查询,以及多少的更新/插入/删除,但仅仅清楚知道这些还是不能清楚地知道一个mysql实例的压力情况,因为一个全表扫描查询与一个走主健索引的查询给服务器带来的压力差了好几个数量级,但以com_select 指标来衡量,都只是一个com_select查询. 因此,我们需要了解更多更底层的性能指标。

  

Mysql所有的涉及到性能的指标,都是从show global status 命令获得,但这个命令获得指标值(除极个别除外)是从mysql实例启动以来的累积计数。所以,需要知道最近时间区间的值,则需要做差值。第一部分innodb row

Innodb_row_lock_current_waits:当前的innodb 行锁等待的线程数。

Innodb_row_lock_time:实例启动起来的行锁等待时间,单位milliseconds

Innodb_row_lock_time_avg:  行锁等待时间的平均值,单位milliseconds

Innodb_row_lock_time_max:  最大等待时间,单位milliseconds。

Innodb_row_lock_waits: 累计等待次数。

Innodb_rows_deleted :累计的deleted 行数。

Innodb_rows_inserted :累计的insert 行数。

Innodb_rows_read:累计的读取行数

Innodb_rows_updated:累计的update行数。

第二部分innodb page

Innodb_page_size: 固定大小,16K

Innodb_pages_created: 把初始化页放入innodb buffer pool内存时该值增加,在函数buf_page_create()内增加其值。

Innodb_pages_read: 将页物理读取时(将非新建的页读入到内存池),该值增加,单位为页数。

Innodb_pages_written: 将内存页刷新到磁盘,该值增加,单位为页数。

第三部分 innodb data

Innodb_data_fsyncs:文件sync到磁盘的操作次数,包括数据文件与日志文件。

Innodb_data_pending_fsyncs:刷新时因为io压力堵塞的次数,包括日志文件刷新pending 与数据文件刷新pending的总数,该值为实时值,实际为Innodb_data_pending_reads与Innodb_data_pending_writes之和。

Innodb_data_pending_reads:当前同步物理读操作pending的总数,操作之前加1,操作完成减1.

Innodb_data_pending_writes:当前同步物理写操作pending 的总数,操作前加1,操作完成减1.

Innodb_data_read:物理读的字节数。

Innodb_data_reads:物理读的页数。

Innodb_data_writes:物理写的页数。

Innodb_data_written:物理写的字节数。

第四部分 Innodb_buffer



Innodb_buffer_pool_pages_data:  缓冲池中的数据页page数。

Innodb_buffer_pool_bytes_data:缓冲池中的数据页page的总字节数。即页数乘以页的大小。

Innodb_buffer_pool_pages_dirty:脏页数(实时值)。

Innodb_buffer_pool_bytes_dirty:脏页的总字节数(实时值)。

Innodb_buffer_pool_pages_flushed:总共有多少page被flushed.

Innodb_buffer_pool_pages_free: 池中空闲的块。

Innodb_buffer_pool_pages_latched:被latched 保护的页数,一般为即将被读写的页(实时值)。

Innodb_buffer_pool_pages_misc:该值=池中总页-(减)LRU列表的页数-(减)Free列表的页数。

Innodb_buffer_pool_pages_total:池中的总页数。

Innodb_buffer_pool_read_requests:读请求的次数。

Innodb_buffer_pool_reads:物理读取页到缓冲池的次数。

Innodb_buffer_pool_wait_free:等待空余页的次数。

Innodb_buffer_pool_write_requests:写请求的次数。

第五部分 innodb log

Innodb_log_waits:该值为将线程产生的redo log 写入innodb log buffer时,因为innodb_log_buffer 空余空间不足,需要将现有的redo log 写入logfile 文件之后,释放空间所产生的等待次数。

Innodb_log_write_requests:发起写redo logfile buffer 的次数,一个log_write_request 可能会出发多个innodb_log_writes.

Innodb_log_write: 每个Innodb_log_write_requests 可能会由多个innodb_log_write 来完成。具体几次,则由需要写入的redo log buffer 的大小来决定。

Innodb_os_log_fsyncs将redo log buffer 刷新到磁盘的次数。

Innodb_os_log_pending_fsyncs将redo log buffer 刷新到磁盘时等待完成的状态,该值是实时值。刷新之前加1,刷新完成后减1.

Innodb_os_log_pending_writes将redo log buffer 写入redo log file 是的实时状态,写之前加1,写完之后减1. 如果不为0,则表示当前有io线程正在写。

Innodb_os_log_written表示写入redo logfile 的总的字节数。该值是累加值。

第六部分 connection

Aborted_connects:未能正常建立连接的会话数量,例如密码错误的连接会导致该值增加或者mysqld因为内存少等原因导致无法创建新的线程。总之,除最大连接数超出的错误外,任何导致连接失败的错误,该值都加1.

Connection_errors_internal:因为mysqld内部的错误而导致无法建立连接,该值加1. 该值增加的同时,Aborted_connects定会增加。

connection_errors_max_connection:因为最大连接数超出而导致新连接失败,该值加1.

Connection_errors_peer_address:因为ip物理地址通信出现错误,该值加1.(基本不出现)

Connection_errors_select:选择监听端口时出现错误,该值加1。(基本不出现)

connection_errors_tcpwrap:出现连接被tcp wrapper拒绝的错误,该值加1.(基本不出现)。

connection_errors_tcpwrap,Connection_errors_select,Connection_errors_peer_address这三个值如果增加,跟mysqld服务本身没有关系,是操作系统层或者网络出现问题导致。但这些情况基本不出现。

Connections:建立mysql连接的总数,每建立一次连接,该值加1.

 

Max_used_connections:连接数曾经达到的最大值。通过这个值与系统环境变量max_connections比较,可以判断有没有连接数超出的情况。

Threads_connected:mysqld 当前已建立的连接数。

第七部分 thread

Delayed_insert_threads:当前指定为延迟插入的线程。

Slow_launch_threads:会话创建时间超出参数变量slow_launch_time指定时间的会话总数,该值为累积值。

Threads_cached:当前cache的线程数,如果有cache的线程时,当新连接进来时,使用cache的thread给新会话使用。该值为当前值。

Threads_connected:当前建立的会话线程数,该值为当前值。

Threads_created:自mysqld实例启动以来,已经创建过的线程数。因为thread是可以cache起来被新连接使用的,所以该值远远小于Connections

Threads_running:当前状态为非sleep的线程的总数,实时值。第八部分 handler



通过上面的实验结果,我们总结如下:(限于篇幅,省去实验部分)。

[list=1][*]不走索引,对表进行全表扫描操作时,Handler_read_first,Handler_read_key 的值各增加1,Handler_read_rnd_next 与扫描的行数匹配。

[/*][*]走主键索引时,handler_read_key 值增加的数量与传递多少个key有关系,例如select  *  fromxcytest_Ind where a in (1,2,3) sql,  handler_read_key会增加3而select * from xcytest_Ind where a >10 sql执行后,handler_read_key 之后只会加1。  而handler_read_next增加多少与在主键上查找的行数有一定关系,但并非完全匹配。 例如handler_read_next在select* fromxcytest_ind where a in (1,2,3) 这样的sql执行后该值不会增加,因为是主健等值匹配,所以hanlder_read_next [b]不会增加。而select* from xcytest_ind where a >10 and  a10 and  a


    关注 数据库随笔


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册

页数 相关文章