linux CentOS 7 mysql pt-query-digest 分析慢sql + profiling 分析具体SQL

一、. 安装pt-query-digest

1. 下载最安装包:wget https://www.percona.com/downloads/percona-toolkit/2.2.16/RPM/percona-toolkit-2.2.16-1.noarch.rpm (可以安装最新的)

2. 用yum安装:yum localinstall -y percona-toolkit-2.2.16-1.noarch.rpm   (要切换到1中下载的.noarch.rpm文件所在的目录,操作完1,直接操作2,不用切换目录。)

二、打开mysql的慢日志。

1. 打开mysql的配置文件:(一般在/etc/my.cnf, 如果没有,用find -name my.cnf 查找)

vim /etc/my.cnf

2. 设置慢sql配置

slow_query_log=1           #打开慢sql日志
slow_query_log_file=/var/lib/mysql/slow-query.log   # 慢日志存放的路径,这个要记住,后续要用。
long_query_time=0.001   # 慢日sql的阈值,这里是为了测试,所以设置的很小。

linux CentOS 7 mysql pt-query-digest 分析慢sql + profiling 分析具体SQL

3. 关闭后,重启mysql,   service mysqld restart (这里是linux CentOS 7,其它系统的重启请自行查找)

linux CentOS 7 mysql pt-query-digest 分析慢sql + profiling 分析具体SQL

三、执行一些sql。

四、生成报告

 pt-query-digest /var/lib/mysql/slow-query.log>> slowreport3.log   # 其中  /var/lib/mysql/slow-query.log 为二中设置的日志路径。

五、查看日志(报告中的各字段的含义网上已经特别多,可以自行查阅,也可以参考下面和选取的部分)

linux CentOS 7 mysql pt-query-digest 分析慢sql + profiling 分析具体SQL

linux CentOS 7 mysql pt-query-digest 分析慢sql + profiling 分析具体SQL

linux CentOS 7 mysql pt-query-digest 分析慢sql + profiling 分析具体SQL

六、用profiling分析具体的sql

1. 设置profiling: set profiling=1;

linux CentOS 7 mysql pt-query-digest 分析慢sql + profiling 分析具体SQL

2. 执行慢SQL, 如:

linux CentOS 7 mysql pt-query-digest 分析慢sql + profiling 分析具体SQL

3. show profiles, 查看总览

linux CentOS 7 mysql pt-query-digest 分析慢sql + profiling 分析具体SQL

4. show profile all for query 1; 查看具体query 的详细信息 在这里就要分析具体的原因了。

linux CentOS 7 mysql pt-query-digest 分析慢sql + profiling 分析具体SQL

5. explain 执行语名, 看下执行计划,看看其操作的信息。

linux CentOS 7 mysql pt-query-digest 分析慢sql + profiling 分析具体SQL

其中比较重要的信息如下,如果想知道更多信息可以参考(http://www.cnitblog.com/aliyiyi08/archive/2008/09/09/48878.html

Type:

1)。ALL :全表无索引扫描

2)。index:有索引全表扫描

3)。 Range:范围扫描 (用了between <> 等)

possible_keys: 指出MySQL能使用哪个索引在该表中找到行

Key: 表示Mysql实际决定使用的索引。没有索引时就是null。

key_len:列显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好 

ref:显示使用哪个列或常数与key一起从表中选择行。

rows:列显示MySQL认为它执行查询时必须检查的行数。

6. 从5可以看出,没有使用索引,那么就要查下该表是否创建了索引:show indexes from Firstdatabase.users;

linux CentOS 7 mysql pt-query-digest 分析慢sql + profiling 分析具体SQL

Non_unique:如果索引不能包括重复值则为0,反之为1

Key_name: 索引名称,名称相同表示是同一个索引即联合索引

Seq_in_index: 和Column_name结合, 即seq_in_index值小的所对应的列,在使用索引时会优先调用。

Collation:索引列是以什么方式存储在索引中,在MySQL中,有值‘A’(升序)或NULL(无分类)

Cardinality:基数的意思,表示索引中唯一值的数目的估计值。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。我们知道某个字段的重复值越少越适合建索引,所以我们一般都是根据Cardinality来判断索引是否具有高选择性,如果这个值非常小,那就需要重新评估这个字段是否适合建立索引。因为MySQL数据库中有各种不同的存储引擎,而每种存储引擎对于B+树索引的实现又各不相同。所以对Cardinality统计时放在存储引擎层进行的,至于它是如何统计更新的在这里就不再做更深入的介绍了
Sub_part:前缀索引,如果列只是被部分的编入索引,则为被编入索引的字符的数目;如果整列被编入索引,则为NULL。一般对于BLOB,TEXT或者很长的VARVHAR类型的列,必须使用前置索引,如果使用完整长度会让索引变得很慢

Packed:指示关键字如何被压缩,如果没有被压缩,则为NULL

NULL:如果列中含有NULL则为YES

Index_type:索引方法,FULLTEXT、HASH、BTREE、RTREE,常用的是BTREE

 

上一篇:Locust最佳实践之分布式容器化部署(五)


下一篇:OpenCV 计算点到多边形的距离,判断是否在多边形内