Percona-Toolkit系列(31) --- pt-table-usage

pt-table-usage

pt-table-usage:官方地址

说明

用途:分析查询时如何使用表的。

语法:

pt-table-usage [OPTIONS] [FILES]

通过读取日志(例如:慢查询日志)中的查询语句,然后分析语句是如何使用表的,即:表之间的数据流向。

具体例子

这里仅仅举例子,实际上该工具用处不大。不如直接使用EXPLAIN

分析指定查询语句

[root@BigData ~]# pt-table-usage --query="select t01.name from t01 join t02 on t01.id=t02.id where t01.code=2"
Query_id: 0xCAE49665073A58D1.1
SELECT t01
JOIN t01
JOIN t02
WHERE t01
[root@BigData ~]# pt-table-usage --query="UPDATE t1 AS a JOIN t2 AS b USING (id) SET a.foo='bar', b.foo='bat' WHERE a.id=1;"
Query_id: 0x331745DE4B0936AB.1
UPDATE t1
SELECT DUAL
JOIN t1
JOIN t2
WHERE t1

Query_id: 0x331745DE4B0936AB.2
UPDATE t2
SELECT DUAL
JOIN t1
JOIN t2
WHERE t1

分析慢查询日志的SQL

pt-table-usage /var/lib/mysql/mysql.slow

输出结果说明:

  • Query_id:表示该查询的ID和pt-query-digest报告中的ID相同,是该语句的"fingerprint"的MD5 checksum。所谓"fingerprint"就是在删除条件值、多余空格和各种其他转换之后剩下的内容。如下:
    UPDATE t1 AS a JOIN t2 AS b USING (id) SET a.foo='bar', b.foo='bat' WHERE a.id=1;的"fingerprint"就是"UPDATE t1 AS a JOIN t2 AS b USING (id) SET a.foo=?, b.foo=? WHERE a.id=?;"
  • SELECT:表示从表中获取数据,原因有两个:

    第一个是作为结果集的一部分返回给用户。只有SELECT queries返回结果集,因此报告总是显示SELECT查询的SELECT上下文。

    第二种情况是数据作为插入或更新的一部分流到另一个表。例如,上面例子中的UPDATE查询的用法是:SELECT DUAL,DUAL表示该值(a.foo=‘bar’, b.foo=‘bat’)不少从表中获取的。如果改成SET a.foo=b.foo,那么就变成了:
    Query_id: 0x1CD27577D202A339.1
    UPDATE t1
    SELECT t2
    JOIN t1
    JOIN t2
    WHERE t1
    
  • JOIN:表示已连接的表。要么显示指定JOIN,要么是在WHERE条件中指定,如:t1.id = t2.id
  • WHERE:WHERE上下文列出WHERE子句中用于过滤结果的表。这并不包括WHERE子句中隐式连接的表;这些被列出为连接上下文。例如:
    WHERE t1.id > 100 AND t1.id < 200 AND t2.foo IS NOT NULL
    
    对应
    WHERE t1
    WHERE t2
    
    仅显示不同的表,所以表t1才出现一次
  • TLIST:列出查询语句中访问的表,但是该表又不会出现在SELECTFROM中间。所以这些通常是产生笛卡尔积。例如:SELECT * FROM t1, t2
    Query_id: 0xBDDEB6EDA41897A8.1
    SELECT t1
    SELECT t2
    TLIST t1
    TLIST t2
    

你可能感兴趣的:(Percona)