Mysql慢查询与sql调优常用查询语句

在性能测试过程中,如果出现性能瓶颈或响应时间过长,波动比较大,TPS存在波动且起伏比较大时,就需要进行性能分析。

主要分析思路可以从以下几个方面考虑:
1、业务问题,系统代码本身业务逻辑问题,如:事务失败率;
2、系统服务器资源出现瓶颈导致,如:CPU、内存、I/O、进程数等;
3、数据库层面问题,如:慢查询,连接数,死锁;
4、java应用的堆内存相关,GC等;
5、受第三方系统的问题影响;
先看下基础配置,监控mysql执行的sql语句需要先开启相关日志

linux系统
可以在/etc/mysqld中添加如下:
指定日志路径
log =/usr/local/mysql/mysql.log (这个路径自定义即可)
就可以使用:
tail -f mysql.log
如果需要监控慢查询可以添加如下内容:
添加慢查下记录
log-slow-queries = /usr/local/mysql/slowquery.log(这个路径自定义即可)
long_query_time = 1

windows系统
修改my.ini,在mysqld下添加log一行,
[mysqld]
log = “D:/tmp/mysql_log/mysql_log.sql” (这里路径自定义即可)
然后,重新启动mysql,就可以实时看到myql服务器当前正在执行的语句了。

常用的SQL,用于诊断排查问题

本编文章主要从慢查询角度去分析(Mysql)

  1. 数据库开启慢查询日志
    是否开启慢查询日志,1表示开启,0表示关闭
    show variables like ‘%slow_query_log%’;
    set global slow_query_log=ON;
    未使用索引的查询也被记录到慢查询日志中(可选项)
    show variables like ‘log_queries_not_using_indexes’;
    set global log_queries_not_using_indexes=on;
    慢查询阈值
    show variables like ‘long_query_time’;
    set global long_query_time=4;
    show global variables like ‘long_query_time’;
    第二个查看点
    (1)查看执行计划使用下方这个sql语句
    explain SELECT *from case;
    1、id:select查询中的序列号,包含一组数字,表示查询中执行select字句或操作表的顺序;
    2、type:访问类型,sql查询优化一个很重要的指标,结果值从好到坏依次是:
    System>const>eq_ref>ref>fulltext>ref_or_null>index_merge>uniqe_subquery>index_subquery>range>index>ALL,一般来说,好的sql查询至少能达到range级,做好为ref。
    3、Key:实际使用的索引,如果未NULL,则没有使用索引;
    4、rows:根据表统计信息及索引选取情况,大致估算出找到所需的记录所需要的行数,一般该值越小越好;
    5、Extra:不适合在其它字段中显示,但是十分重要的额外信息。
    由此,可以知道:sql缺少相应的索引导致出现慢查询问题
    (2)打开profile功能,对sql进行分析,看时间具体消耗
    打开profile功能
    show variables like “%profiling%”;
    set profiling=1;
    查看profiles文件
    show profiles;
    也可以根据sql查询语句排查sql执行速度慢的原因:
  2. 查看当前应用连接,连接数突增排查

select user,SUBSTRING_INDEX(host,’:’,1) as ip , count(*) as count,db from information_schema.processlist where host not in (‘localhost’) and user not in (‘replicater’) group by ip order by count;

  1. 当前有没有锁

select * from information_schema.innodb_locks;

  1. 查看哪些sql执行最多

SELECT SCHEMA_NAME,DIGEST_TEXT,COUNT_STAR,SUM_ROWS_SENT,SUM_ROWS_EXAMINED,FIRST_SEEN,LAST_SEEN FROM performance_schema.events_statements_summary_by_digest where SCHEMA_NAME is not null and SCHEMA_NAME !=‘information_schema’ ORDER BY COUNT_STAR desc LIMIT 1;

  1. 哪个SQL扫描的行数最多(IO消耗)

SELECT SCHEMA_NAME,DIGEST_TEXT,COUNT_STAR,AVG_TIMER_WAIT,SUM_ROWS_SENT,SUM_ROWS_EXAMINED,FIRST_SEEN,LAST_SEEN FROM performance_schema.events_statements_summary_by_digest where SCHEMA_NAME is not null and SCHEMA_NAME !=‘information_schema’ ORDER BY SUM_ROWS_EXAMINED desc LIMIT 1\G

  1. 哪个SQL使用的临时表最多

SELECT SCHEMA_NAME,DIGEST_TEXT,SUM_CREATED_TMP_DISK_TABLES,SUM_CREATED_TMP_TABLES,FIRST_SEEN,LAST_SEEN FROM performance_schema.events_statements_summary_by_digest where SCHEMA_NAME is not null and SCHEMA_NAME !=‘information_schema’ ORDER BY SUM_CREATED_TMP_DISK_TABLES desc LIMIT 1\G

  1. 哪个SQL排序数最多(CPU消耗)
    SELECT SCHEMA_NAME,DIGEST_TEXT,COUNT_STAR,SUM_ROWS_SENT,SUM_SORT_ROWS,FIRST_SEEN,LAST_SEEN FROM performance_schema.events_statements_summary_by_digest where SCHEMA_NAME is not null and SCHEMA_NAME !=‘information_schema’ ORDER BY SUM_SORT_ROWS desc LIMIT 1\G

  2. 哪个索引使用最多
    SELECT OBJECT_NAME, INDEX_NAME, COUNT_FETCH, COUNT_INSERT, COUNT_UPDATE, COUNT_DELETE FROM performance_schema.table_io_waits_summary_by_index_usage ORDER BY SUM_TIMER_WAIT DESC limit 1;

  3. 哪个索引没有使用过

SELECT OBJECT_SCHEMA, OBJECT_NAME, INDEX_NAME FROM performance_schema.table_io_waits_summary_by_index_usage WHERE INDEX_NAME IS NOT NULL AND COUNT_STAR = 0 AND OBJECT_SCHEMA <> ‘mysql’ ORDER BY OBJECT_SCHEMA,OBJECT_NAME;

  1. 哪个表、文件逻辑IO最多(热数据)

SELECT FILE_NAME,EVENT_NAME,COUNT_READ,SUM_NUMBER_OF_BYTES_READ,COUNT_WRITE,SUM_NUMBER_OF_BYTES_WRITE FROM performance_schema.file_summary_by_instance ORDER BY SUM_NUMBER_OF_BYTES_READ+SUM_NUMBER_OF_BYTES_WRITE DESC LIMIT 2\G

  1. 查看某条sql各阶段执行时间,可开启profiling功能

set global profiling=on;

你可能感兴趣的:(性能优化)