Percona Toolkit 神器全攻略(性能類) Percona Toolkit 神器全攻略系列共八篇,前文回顧: 前文回顧 Percona Toolkit 神器全攻略 Percona Toolkit 神器全攻略(實用類) Percona Toolkit 神器全攻略(配置類) Percona T ...
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