如何对MySQL数据库定一个整体的基调?纯干货!
作为DBA,在进行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''; 命令查询结果。
之前整理的核心资料,觉得有用的点波关注哦~