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
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章