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
:列出查詢語句中訪問的表,但是該表又不會出現在SELECT
和FROM
中間。所以這些通常是產生笛卡爾積。例如:SELECT * FROM t1, t2
Query_id: 0xBDDEB6EDA41897A8.1 SELECT t1 SELECT t2 TLIST t1 TLIST t2