mysql慢查询分析

1. 慢查询配置

开启慢查询日志
查询状态
show variables like 'slow_query_log';
设置开启或关闭
set global slow_query_log = ['ON'/'OFF'];

指定慢查询日志log文件
set global slow_query_log_file = /var/lib/mysql/slowlog.log

设置超时则写入到慢查询日志中,可以有6位小数,到微秒;设置为0,则所有sql记录到慢查询日志中
set global long_query_time = xx.xxx秒

所有未使用索引的sql记录到日志中
set globallog_queries_not _using_indexes= ['ON'/'OFF']

持久化配置:my.cnf中配置慢查询配置

image

查询慢查询配置:show variables like '%query%';

image

2. mysqldumpslow命令分析慢查询

/*传入慢查询日志作为参数*/
mysqldumpslow[ OPTS... ][ LOGS...]

mysqldumpslow slowlog.log

image

3. 使用Percona Toolkit工具分析慢查询

image
image

/* Percona Toolkit工具 源码下载 */
/* 安装依赖 */
yum install perl-DBI.x86_64
yum install perl-DBD-MySQL.x86_64
yum install perl-IO-Socket-SSL.noarch
yum install perl-Digest-MD5.x86_64
yum install perl-TermReadKey.x86_64
yum install perl-CPAN 
yum install perl-Time-HiRes
/* 下载源码 */
wget percona.com/get/percona-toolkit.tar.gz
tar zxf percona-toolkit.tar.gz
cd percona-toolkit-3.5.5
perl Makefile.PL PREFIX=/usr/local/percona-toolkit

/* 将容器中的log复制出来 */
docker cp ae:/var/lib/mysql/slowlog.log /home/bk
/* 示例 */
pt-query-digest [OPTIONS][FILES][DSN]
pt-query-digest /home/bk/slowlog.log

image

4.监控长时间运行的SQL

/* 只能查询到自己账户下的sql */ 
SELECT id, 'user', 'host', DB, command, 'time', state, info FROM information_schema.PROCESSLIST WHERE TIME>=60;

5.EXPLAIN执行计划内容分析

1 2 3 4 5 6 7 8 9 10 11 12
id select_type table partitions type possible keys key key_len ref rows filtered Extra

5.1 ID

  • ID表示查询执行的顺序
  • ID相同时由上到下执行
  • ID不同时,由大到小执行

5.2 select_type

含义
SIMPLE 不包含子查询或是UNION操作的查询
PRIMARY 查询中如果包含任何子查询,那么最外层的查询则被标记为PRIMARY
SUBQUERY SELECT列表中的子查询
DEPENDENT SUBQUERY 依赖外部结果的子查询
UNION union操作的第二个或是之后的查询的值为union
DEPENDENTUNION 当UNION做为子查询时,第二或是第二个后的查询的select_type值
UNION RESULT UNION产生的结果集
DERIVED 出现在FROM子句中的子查询

5.3 table

  • 指明是从那个表中获取数据
  • "unionM,N"由ID为MN查询union产生的结果集
  • "derived N" 或者 "subquery N" 由ID为N的查询产生的结果

5.4 partitions

  • 对于分区表,显示查询的分区ID
  • 对于非分区表,显示NULL

5.5 type

性能 含义
system 这是const联接类型的一个特例,当查询的表只有一行时使用
const 表中有且只有一个匹配的行时使用,如对主键或是唯一索引的查询,这是效率最高的联接方式
eq_ref 唯一索或主键引查找,对于每个索引键,表中只有一条记录与之匹配
ref 非唯一索引查找,返回匹配某个单独值的所有行
ref or_null 类似于ref类型的查询,但是附加了对NULL值列的查询
index_merge 该联接类型表示使用了索引合并优化方法
range 引范围扫描,常见于between、>、<这样的查询条件
index FULLindex Scan全索扫描,同ALL的区别是,遍历的是索引树
DERIVED 出现在FROM子句中的子查询

5.6 possible keys

  • 指出查询中可能会用到的索引

5.7 key

  • 指出查询时实际用到的索引

5.8 key_len

  • 实际使用索引的最大长度

5.9 ref

  • 指出那些列或常量被用于索引查找

5.10 rows

  • 跟据统计信息预估的扫描的行数

5.11 filtered

表示返回结果的行数占需读取行数的百分比,越高越好

5.12 Extra

含义
Distinct 优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作
Not exists 使用notexists来优化查询
Using filesort 使用文件来进行排序,通常会出现在order by 或group by查询中
Using index 使用了覆盖索引进行查询
Using temporary MySQL需要使用临时表来处理查询,常见于排序,子查询和分组查询
Using where 需要在MySQL服务器层使用WHERE条件来过滤数据
select tables optimizedaway 直接通过索引来获得数据,不用访问表
posted @ 2023-12-03 16:59  osbreak  阅读(8)  评论(0编辑  收藏  举报