数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

mysql性能问题定位


发布日期:2019年05月01日
 
mysql性能问题定位

使用mysql作为基础数据库的应用可能会遇到一些数据库方面的性能问题我们可以通过一些方法进行问题定位以下介绍可以定位性能问题的四种方法欢迎拍砖

开启慢查询日志

记录执行查询时间大于long_query_time的sqllong_query_time默认为s;

show variables like %slow%

得到图中所示信息这里可以查看到慢查询日志是否开启慢查询日志文件的存放目录

开启慢查询日志的方法

vi /etc/f(这个是mysql的默认读取配置文件目录一般会将f文件放在这下面)

[mysqld]下添加

slow_query_log=ON

long_query_time=(sql语句执行时间超过该参数值则会打印在慢查询日志中)默认执行时间超过s的sql会打印在慢查询日志中

修改了f中的配置项需要重启数据库

不重启数据库的情况下执行 set global slow_query_log=ON可以开启慢查询日志

开启慢查询日志后跟蹤慢查询日志文件中的慢查询sql再具体分析通过调整sql写法或者添加正确的索引可以看到意想不到的性能效果

分析慢查询sql:

Explain 打印执行计划

执行的selcet语句前面加上explain可以告诉你mysql如何执行该条语句

这里需要额外注意typekeyrows extra列展示的内容

其中

Type=all表示使用的是全表扫描在数据量大的情况下全表扫描是非常耗性能的这个需要特别注意;

Type=index表示使用索引扫描只会遍历索引树;

Type=range表示使用索引范围扫描常见于between ><等的查询

Type=ref非唯一性索引扫返回匹配某个单独值得所有行

Type=eq_ref 唯一性索引扫描对于每个索引键表中只有一条记录与之匹配

Type=const/system 读常量最多只会有一条记录匹配由于是常量实际上只须要读一次

Type=null 不需要扫描表

访问类型从上到下由差变为最好

key表示select中使用到的索引如果为null表示没有使用索引从查询效率上讲使用索引比不使用索引快但并不是所有的都要加索引索引也存在不足这里就不详解

rows表示执行该条sql所需要扫描的行数这个没有绝对值可参考一般来说越小越好如果万数据量的数据库rows是通过这个可以判断sql的查询性能很差如果万条数据量的数据库rows是从我个人的角度还是能接受的

extra

一些十分重要的额外信息重点关注出现关键字

Using filesort当Query 中包含order by 操作而且无法利用索引完成排序操作的时候MySQL Query Optimizer 不得不选择相应的排序算法来实现

Using temporary:在某些操作中必须使用临时表时在 Extra 信息中就会出现Using temporary 主要常见于 GROUP BY 和 ORDER BY 等操作中

当执行计划Extra 出现Using filesort Using temporary 时可以考虑是否需要进行sql优化和调整索引最后再调整f 中与排序或者临时表相关的参数如sort_buffer_size或者tmp_table_size

show full processlist 查看哪条sql一直占用进程

Time表示执行当前操作所耗费的时间单位为秒(s);

State表面当前线程的状态Info表示正在执行的操作;

这里如果发现time值比较大state一直处于一个状态那么从Info中我们可以获得耗时长的操作再具体分析;

注意观察State中出现关于lock关键字的状态

这个命令可以很直观地看到正在执行的sql及其当前状态操作比较方便

show profile 定位sql在数据库中资源占用情况(注意一个是show profiles一个是show profile)

Show profiles主要展示在当前会话中profiling_history_size条sql执行的时间query_id默认为最大为不能设为

SHOW VARIABLES LIKE %profiling_history_size%

SHOW VARIABLES LIKE %profiling或者select @@profiling 查看profiling是否开启

set profiling= 开启profiling

执行一条sql

再执行show profiles会把最近执行的sql给展示出来

从图中找到刚刚执行的sqlquery_id是执行时间是s

如果我们想看sql在各个阶段所消耗时间则使用如下

SHOW PROFILE FOR QUERY

各个阶段所消耗时间一目了然

show profile具体写法为 Show profile TYPE for query nn为query_idTYPE可写可不写

TYPE的取值有为ALLBLOCK IOCONTEXT SWITCHESCPUIPCMEMORYPAGE FAULTSSOURCESWAPS

如上述例子中

SHOW PROFILE CPUMEMORY FOR QUERY

不加for query n这句则展示执行show profile之前执行过一条语句

Mysqladmin 查询整个数据库的状态

在mysql的bin目录下执行

/mysqladmin u用户名 p密码 proc stat

这里添加proc就如同show full processlist功效

stat展示当前数据库的状态

threads 表示当前线程数Opens 当前打开的表数目Queries per second 每秒执行的查询数数据库性能越好这个值就越高

               

上一篇:忘了MySQL的管理员密码怎么办?

下一篇:建站教程之数据库Mysql mysqlsla在Linux之下的正确操作