Percona Toolkit 神器全攻略(效能類)
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
技術交流群:
微信:掃碼新增
GreatSQL社群助手
微信好友,傳送驗證資訊加群
。