Percona Toolkit 神器全攻略(效能類)

GreatSQL發表於2024-09-13

Percona Toolkit 神器全攻略(效能類)

file

Percona Toolkit 神器全攻略系列共八篇,前文回顧:

前文回顧
Percona Toolkit 神器全攻略
Percona Toolkit 神器全攻略(實用類)
Percona Toolkit 神器全攻略(配置類)
Percona Toolkit 神器全攻略(監控類)
Percona Toolkit 神器全攻略(系統類)
Percona Toolkit 神器全攻略(開發類)
Percona Toolkit 神器全攻略(複製類)

全文約定:$為命令提示符、greatsql>為GreatSQL資料庫提示符。在後續閱讀中,依據此約定進行理解與操作

效能類

在Percona Toolkit中效能類共有以下工具

  • pt-index-usage:分析日誌中索引使用情況,並出報告
  • pt-pmp:查詢結果跟蹤,並彙總跟蹤結果
  • pt-table-usage:分析日誌中查詢並分析表使用情況
  • pt-visual-explain:格式化執行計劃
  • pt-mongodb-index-check:MongoDB 索引執行檢查
  • pt-mongodb-query-digest:透過聚合來自 MongoDB 查詢分析器的查詢來報告查詢使用統計資訊

pt-index-usage

概要

從慢查詢日誌中讀取查詢並分析它們如何使用索引

用法

  • pt-index-usage [OPTIONS] [FILES]

選項

該工具所有選項如下

引數 含義
--ask-pass 連線 MySQL/GreatSQL 提示輸入密碼
--charset 預設字符集
--config 讀取這個逗號分隔的配置檔案列表,如果指定,這必須是命令列上的第一個選項
--create-save-results-database 如果--save-results-database不存在,則建立它
--[no]create-views --save-results-database示例查詢建立檢視
--database 用於連線的資料庫
--databases 僅從此逗號分隔的資料庫列表中獲取表和索引
--databases-regex 僅從資料庫中獲取名稱與此 Perl 正規表示式匹配的表和索引
--defaults-file 只從給定檔案中讀取 MySQL/GreatSQL 選項
--drop 建議僅刪除這些型別的未使用索引
--empty-save-results-tables 刪除並重新建立--save-results-database中所有預先存在的表
--help 顯示幫助
--host 連線到主機
--ignore-databases 忽略這個以逗號分隔的資料庫列表
--ignore-databases-regex 忽略名稱與此 Perl 正規表示式匹配的資料庫
--ignore-tables 忽略這個以逗號分隔的表名列表
--ignore-tables-regex 忽略名稱與 Perl 正規表示式匹配的表
--password 連線時使用的密碼
--port 連線的埠號
--progress 將進度報告列印到 STDERR
--quiet 不列印任何告警
--[no]report 根據-–report-format報告格式列印報告
--report-format 報告的格式,目前只有一種:drop_unused_indexes
--save-results-database 將結果儲存到該資料庫中的表中
--set-vars 在這個以逗號分隔的variable=value對列表中設定 MySQL/GreatSQL 變數
--socket 用於連線的套接字檔案
--tables 僅從這個以逗號分隔的表列表中獲取索引
--tables-regex 僅從名稱與此 Perl 正規表示式匹配的表中獲取索引
--user 登入的使用者
--version 顯示版本
--[no]version-check 版本檢查

最佳實踐

$ pt-index-usage /data/GreatSQL/slow.log --host='localhost' --user='root' --ask-pass
ALTER TABLE `tpch`.`lineitem` DROP KEY `lineitem_fk1`, DROP KEY `lineitem_fk2`; -- type:non-unique

該工具連線到GreatSQL資料庫伺服器,讀取查詢日誌,並使用EXPLAIN詢問GreatSQL將如何使用每個查詢。當完成時,列印出一個關於查詢沒有使用的索引

也可以將列印出來的結果存入到資料庫當中

$ pt-index-usage /data/GreatSQL/slow.log --no-report --save-results-database h=127.0.0.1,P=3306,u=root,p=,D=test_db

進入到資料庫中就可以看到自動建立了四張表

greatsql> show tables;
+--------------------+
| Tables_in_test_db  |
+--------------------+
| index_alternatives |
| index_usage        |
| indexes            |
| tables             |
+--------------------+
4 rows in set (0.01 sec)
  • index_alternatives:此表記錄了索引的替代方案。它包含了關於哪些索引可以替代其他索引的資訊。

  • index_usage:這張表跟蹤了索引的使用情況。它記錄了哪些索引被查詢使用,以及它們的效率和效能。

  • indexes:此表包含了資料庫中所有表的索引資訊。它記錄了每個表的索引名稱、列、型別等。

  • tables:這張表記錄了資料庫中的所有表。它包含了表的名稱、行數、大小等資訊。

額外補充

在MySQL/GreatSQL 5.7版本中,sys schema提供了以下幾張表,有助於分析資料庫索引使用情況

  • schema_index_statistics:此表顯示有關索引的統計資訊,包括索引的大小、行數、唯一性和其他相關指標。它對於最佳化查詢和了解索引的使用情況非常有用
  • schema_redundant_indexes:這個表顯示重複索引或被其他索引替代的索引。具體來說,它列出了哪些索引是多餘的,以及哪些索引是主導索引(使多餘索引變得多餘)
  • schema_unused_indexes:這個表顯示那些沒有被使用的索引。如果某個索引長時間沒有被查詢,就可能是多餘的。透過檢查這個表,您可以找到可以刪除或最佳化的未使用索引

在MySQL/GreatSQL 8.0版本中,也有幾張表關於索引的

  • INFORMATION_SCHEMA.INNODB_INDEXES 表提供有關 InnoDB 索引的後設資料
  • INFORMATION_SCHEMA.INDEX_STATISTICS 表提供了索引統計資訊

pt-pmp

概要

查詢結果跟蹤,並彙總跟蹤結果。獲取程序的堆疊資訊,並且對這些結果進行彙總

程序的堆疊資訊是透過gdb獲取的,所以在獲取過程中,會對資料庫的效能有一定的影響

用法

  • pt-pmp [OPTIONS] [FILES]

選項

該工具所有選項如下

引數 含義
--binary 要跟蹤哪個二進位制檔案
--help 顯示幫助
--interval --iterations之間休眠的秒數
--iterations 要收集和聚合的跟蹤數
--lines 僅聚合許多函式的第一個指定數量,預設值是0也就是無窮大
--pid 要跟蹤的程序的程序 ID
--save-samples 聚合後將原始跟蹤保留在此檔案中
--version 顯示版本

最佳實踐

根據程序名彙總堆疊資訊

$ pt-pmp --binary mysqld
#......輸出太長不展示

使用該工具需要安裝gdb,否則報錯 “gdb: command not found”

彙總pstack獲取的結果

$ ps -ef |grep mysqld
mysql      29297       1  0 Apr24 ?        00:18:07 /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.28-x86_64/bin/mysqld --defaults-group-suffix=@mgr01

$ pstack 29297 > /tmp/29297.info
$ pt-pmp /tmp/29297.info
#......輸出太長不展示

pt-table-usage

概要

分析日誌中查詢並分析表使用情況通。過讀取日誌(例如:慢查詢日誌)中的查詢語句,然後分析語句是如何使用表的,即:表之間的資料流向

用法

  • pt-table-usage [OPTIONS] [FILES]

選項

引數 含義
--ask-pass 連線MySQL/GreatSQL提示輸入密碼
--charset 預設字符集
--config 讀取這個逗號分隔的配置檔案列表,如果指定,這必須是命令列上的第一個選項
--constant-data-value 作為常量資料(文字)源列印的表
--[no]continue-on-error 出錯時跳過錯誤繼續執行
--create-table-definitions 從此逗號分隔檔案列表中讀取CREATE TABLE定義
--daemonize 後臺執行
--database 資料庫名
--defaults-file 只從給定檔案中讀取 MySQL/GreatSQL 選項
--explain-extended 執行 EXPLAIN EXTENDED 查詢的伺服器
--filter 丟棄此 Perl 程式碼不返回 true 的事件
--help 顯示幫助
--host 連線到主機
--id-attribute 使用此屬性標識每個事件
--log 後臺執行時將所有輸出列印到此檔案
--password 連線時使用的密碼
--pid 建立給定的 PID 檔案
--port 用於連線的埠號
--progress 將進度報告列印到 STDERR
--query 分析指定的查詢,而不是讀取日誌檔案
--read-timeout 設定等待輸入中的事件時間,預設為0即永遠等待
--run-time 執行時間,預設永遠執行
--set-vars 以逗號分隔的variable=value對列表中設定 MySQL/GreatSQL 變數
--socket 用於連線的套接字檔案
--user 登入的使用者
--version 顯示版本

最佳實踐

分析語句結構

$ pt-table-usage --query="SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.id WHERE t1.code = 2;"
Query_id: 0xB11D21EDB7630E7E.1
SELECT t1
SELECT t2
JOIN t1
JOIN t2
WHERE t1

個人覺得比較雞肋,還不如使用Explain

分析慢查詢日誌

$ pt-table-usage /data/GreatSQL/slow.log

Query_id: 0x98947CCF9160CAC9.1
SELECT information_schema.ROUTINES
WHERE information_schema.ROUTINES

Query_id: 0x459C4D56E071E4D7.1
SELECT performance_schema.threads
SELECT performance_schema.table_handles
JOIN performance_schema.table_handles
JOIN performance_schema.threads
  • Query_id:查詢的ID
  • SELECT:從表中獲取資料
  • JOIN:已連線的表
  • WHERE:用於過濾結果的表
  • TLIST:查詢語句中訪問的表,通常是產生笛卡爾積

pt-visual-explain

概要

用於格式化 MySQL/GreatSQL 執行計劃

用法

  • pt-visual-explain [OPTIONS] [FILES]

選項

引數 含義
--ask-pass 連線MySQL/GreatSQL提示輸入密碼
--charset 預設字符集
--clustered-pk 假設 PRIMARY KEY 索引訪問不需要對 檢索行
--config 讀取這個逗號分隔的配置檔案列表,如果指定,這必須是命令列上的第一個選項
--connect 將輸入視為查詢,並透過連線到資料庫例項並對查詢執行 EXPLAIN 來獲取輸出
--databases 資料庫列表
--defaults-file 只從給定檔案中讀取 MySQL/GreatSQL 選項
--format 設定輸出格式,有兩種格式(tree、dump)預設為tree
--help 顯示幫助
--host 連線到主機
--password 連線時使用的密碼
--pid 建立給定的 PID 檔案
--port 用於連線的埠號
--set-vars 以逗號分隔的variable=value 對列表中設定 MySQL/GreatSQL 變數
--socket 用於連線的套接字檔案
--user 用於登入的使用者
--version 顯示版本

最佳實踐

直接使用即可

$ mysql -uroot -p -e "explain select * from test_db.test_t1" |pt-visual-explain --clustered-pk
Table scan
rows           9
+- Table
   table          test_t1

此時會輸出該語句格式化後的執行計劃

pt-visual-explain的資訊有限,如果想獲得更多詳細資訊,最好還是進入資料庫檢視執行計劃


Enjoy GreatSQL 😃

關於 GreatSQL

GreatSQL是適用於金融級應用的國內自主開源資料庫,具備高效能、高可靠、高易用性、高安全等多個核心特性,可以作為MySQL或Percona Server的可選替換,用於線上生產環境,且完全免費併相容MySQL或Percona Server。

相關連結: GreatSQL社群 Gitee GitHub Bilibili

GreatSQL社群:

社群部落格有獎徵稿詳情:https://greatsql.cn/thread-100-1-1.html

image-20230105161905827

技術交流群:

微信:掃碼新增GreatSQL社群助手微信好友,傳送驗證資訊加群

image-20221030163217640

相關文章