Mysql 性能剖析

Jmeter + prometheus + Grafana + Mysql_exporter 进行监控。 提示:只是自己学习笔记,自己做记录用,读者应该看不懂。请见谅

学习目标

  • 学会对Mysql数据库的my.cnf文件进行配置
  • 学会使用grafana监控服务器的数据库,监控服务器可能出现的性能瓶颈
  • 当遇到性能瓶颈时,学会进行调优操作

数据库关键指标:

  • TPS 美妙事务数
  • QPS 每秒查询量
  • 连接数
  • 查询吞吐量
  • 查询执行能力
  • 查询缓存

登录数据库,输入sql

show global status like 'questions';  #数据库的总计查询数
show global status like 'uptime';  #数据库的总计运行时间
每秒事务数=数据库的总计查询数 ÷ 数据库的总计运行时间

my.cnf文件配置

cd /etc,打开my.cnf 如果没有这个文件,就新建一个
log_output=table  #设置日志的输出方式,一种是table,另一种是file
slow_query_log=1  #是否打开慢查询日志,设置1表示打开,0表示关闭
#慢查询,指查询速度比较慢的语句,当数据库发现有语句执行速度比较慢时,就会将其记录到日志中
#slow_query_log_file=/var/log/slow_log   #如果上一行选择输出到file中,那么这一行填写文件的路径
long_query_time=1  #设置慢查询的阈值,一般设置为1-10秒
log_queries_not_using_indexes=0  #是否记录未使用索引的情况,1表示打开,0表示关闭
#索引,INDEX,一张表中如果有索引,可以加快检索速度
max_connections=512  #最大连接数
datadir=/var/lib/mysql  #数据文件的存放目录,一般不要改
socket=/var/lib/mysql/mysql.sock  #使用socket时,套接字文件的位置,一般不要改

如果对配置文件进行了修改,需要重启一下mysql

service mysqld restart
system start mysqld

数据库调优

#慢查询语句举例,这个不是项目中的语句,只是举例
select * from sq_orderform;  #这个语句没有where条件,在数据量较大时,非常容易出现慢查询

#删除订单表SQ_ORDERFROM中的某个外键与索引,此时再查询订单,就有可能出现慢查询
ALTER TABLE sq_orderform DROP FOREIGN KEY FK9BD986FB1E208F02;  #删除外键
ALTER TABLE sq_orderform DROP INDEX FK9BD986FB1E208F02;  #删除索引

#当GRAFANA监控到了慢查询语句时,可以在navicat中执行以下语句
select * from mysql.slow_log order by start_time desc;
#按时间倒序显示最近的慢查询语句
#mysql.slow_log 慢查询日志表,如果出现了慢查询,mysql会将出现慢查询的语句写入这个表中
#慢查询语句,记录在sql_text列

#在工作中,将慢查询的SQL语句发给开发处理
#开发调查问题后,发现没有user_id的索引,那么可以添加一下
ALTER TABLE SQ_ORDERFORM ADD CONSTRAINT FK9BD986FB1E208F02 FOREIGN KEY(USER_ID)
REFERENCES SQ_USER(ID) ON DELETE RESTRICT ON UPDATE RESTRICT;

在navicat中,拿到一个慢查询语句,可以尝试进行分析,选中语句,点击"解释已选择的",在下方的解释1里,找到type的值CONST,EQ_REF,REF,RANGE,INDEX,ALL
执行效率CONST > EQ_REF > REF > RANGE > INDEX > ALL

CONST 查询索引字段,且表中只有一行数据
EQ_REF 主键或者唯一索引
REF 非唯一索引
RANGE 索引的范围查询
INDEX 索引
ALL 全表扫描

image.png

远程连接数据库时的注意点

#Mysql数据库初始设置下,是不可以远程访问的,需要update一个表
#都市商城服务器的Mysql不需要设置
mysql -u root -p
输入sq  #登录到数据库
use mysql  #进入mysql库
update user set host='%' where user='root';  #允许远程访问数据库
flush privieleges;  #让更改立刻生效

你可能感兴趣的:(Mysql 性能剖析)