如何对MySQL数据库定一个整体的基调?纯干货!

作为DBA,在进行MySQL数据库性能优化和维护时,首先需要对MySQL数据库定一个整体的基调,对mysql数据库有一个整体的认识,然后在此基础上就可以比较方便地开展后续工作。

为数据库定个基调可以按照下面的思路依次进行(小编整理了很久的):

如何对MySQL数据库定一个整体的基调?纯干货!


一、掌握应用的特点

一般来说,DBA分为开发DBA和运维DBA两种。开发DBA会涉及到业务需求,逻辑模型涉及,物理模型设计,sql代码编写等内容,或者说涉及“外模式-模式-内模式”等各个方面,都业务运行逻辑多少都会有所了解。

而运维DBA一般对业务了解比较少,但从很多实际情况来看,尤其是处理一些优化和复制故障的问题,DBA不了解业务就会受到很多限制。所以DBA掌握数据库技术,要对业务和业务逻辑也熟悉,而且业务优先与技术,只有了解业务逻辑,才能将数据库运行到一个最好的状态。


二、感性的认识

数据库运行的业务不同,参数配置和运行特点也不相同。大体上说,数据库主要用于客户端进行DML操作,select用于查询数据,insert/update/delete用于插入/修改/删除数据,根据两类操作的比重不同,数据库可以分为两类:

OLTP型:insert/update/delete 操作多于select

OLAP型:select操作多于insert/update/delete

OLTP是事务型,是增删改比较多,事务小但数量多;OLAP是分析型的,查询比较多,查询数量少但运行时间通常较长。

对于分析性能问题时,对于把握数据库的主要操作进行归类比较重要,这样可以面对整个业务模型进行归类,化整为零,同时这点也要与上面的业务系统结合,只有了解和熟悉业务状态,才可以在数据库层面运维更好;

总之,感性认识就是指一个数据库是事务比较多,还是查询比较多。


三、使用 show status 命令查看参数值

通过对事务和查询的把握,可以对数据库进行一个整体的感性认识,接下来,还可以通过 show status 命令进行一些主要参数状态的检查,通过实际的数据确认数据库的各种状态。

1.了解各种SQL的执行频率

show global status like 'com_select'; 执行select 操作的次数,一次查询只累加1;

show global status like 'com_insert'; 执行insert操作的次数,对于批量插入的insert操作,只累加一次;

show global status like 'com_update'; 执行update操作的次数;

show global status like 'com_delete'; 执行delete操作的次数;

其他类似参数有: com_stmt_prepare, com_stmt_fetch,...

通过实际计数器查询出数据,从理性分析出执行查询操作与DML执行次数进行比较;

用技术手段检验由业务了解而形成的感性认识;

对于业务基调的认识,先从业务认识到整体上判断,然后再通过具体数据库参数进行确认,比较查询操作的统计数据和DML操作的统计数据的大小;

2.从整体入手了解数据库服务器的状态

show [full] processlist

通过该命令,可以查看目前有哪些进程正在运行。

3.了解事务主动提交和回滚的情况

show global status like 'com_commit'; 提交了的事务计数,主动执行commit命令

show global status like 'com_rollback'; 回滚了的事务计数,主动执行rollback命令

注意:自动提交/回滚的事务不计算在内

通过对事务的提交和回滚的操作比较,可以大致了解事务的发生状况。

4.根据计数器了解读写情况

show status like 'innodb_rows_read'; 查询返回的行数,不仅是select操作,delete和update也会触发对元组的读操作

show status like 'innodb_rows_inserted'; 执行insert操作成功插入的行数

show status like 'innodb_rows_updated'; 执行update操作成功更新的行数

show status like 'innodb_rows_deleted'; 执行delete操作成功删除的行数

通过对行的计数器进行统计,可以了解数据库的读写操作;元组如果发生删除操作,删除操作发生后计数,read也会增加计数。

5.区分“索引读”还是“随机读”

这种情况,不从缓存区的角度出发,从单表扫描数据的方式的角度出发。

mysql> show global status like'handler_read%';
​
+-----------------------+---------------+
​
| Variable_name | Value |
​
+-----------------------+---------------+
​
| Handler_read_first |70372176 |
​
| Handler_read_key |878000134111 |
​
| Handler_read_last |1628850508 |
​
| Handler_read_next |7153827933028 |
​
| Handler_read_prev |1253473280990 |
​
| Handler_read_rnd |448021869416 |
​
| Handler_read_rnd_next | 1374610044012 |
​
+-----------------------+---------------+
​
7 rows in set (0.00 sec)

总结:

查询数据库的各方面运行状态,类似于给系统做了一个体检;然后在通过其他方式进行更深入的了解。这个体检结果是对mysql数据库调优的基础。

注意:上述命令在查看mysql运行状态时,与查询variables一样,都是既有查看当前会话的 show status like'';命令,也有查看所有会话的 show global status like '';命令,有的时候两种方式查询出的结果是一致的。但大部分时候,两者的查询结果是不同的,为了确认mysql运行整体状态,一般建议使用show global status like''; 命令查询结果。


之前整理的核心资料,觉得有用的点波关注哦~

如何对MySQL数据库定一个整体的基调?纯干货!

相关推荐