通常,當資料庫長時間執行較慢時,罪魁禍首往往是「壞」査詢。也就是說,査詢沒有完全最佳化,寫得不好,或者使用者能夠從資料庫中擷取無限數量的列。我們可以透過在伺服器上投入更多的資源來減輕一些痛苦,但這實際上是一個短期修復,不能解決根本問題。最好的做法是識別並修復有問題的査詢,只要花點時間和精力,這應該不會太難。當然,第一步是識別哪些査詢是沒有問題的。有幾種方法可以實現這一點,具體取決於你的特定資料庫類型。今天的文章將重點介紹 MySQL 的一些策略。
使用 MySQL PROCESSLIST 資料表
PROCESSLIST 資料拪是 INFORMATION_SCHEMA 資料庫中許多中繼資料資料表之一。顧名思義,它維護資料庫執行個體中執行的所有程序的資訊。有幾種方法可以存取它,如下面幾節所示。
使用 mysqladmin 命令列工具
Mysqladmin 命令列工具隨 MySQ L一起提供。使用標誌「processlist」(簡稱「proc」)執行它以查看目前正在執行的程序。此外,加入「statistics」標誌(簡稱「stat」)將顯示自 MySQL 上次重啓以來査詢的執行統計資訊:
以下是一些範例輸出:
+-------+------+-----------+-----------+---------+------+-------+--------------------+----------+ | Id | User | Host | db | Command | Time | State | Info | Progress | +-------+------+-----------+-----------+---------+------+-------+--------------------+----------+ | 77255 | root | localhost | employees | Query | 150 | | call While_Loop2() | 0.000 | | 77285 | root | localhost | | Query | 0 | init | show processlist | 0.000 | +-------+------+-----------+-----------+---------+------+-------+--------------------+----------+ Uptime: 781398 Threads: 2 Questions: 18761833 Slow queries: 0 Opens: 2976 Flush tables: 1 Open tables: 101 Queries per second avg: 26.543
由於此命令在 shell 介面上執行,因此可以透過管道將輸出傳輸到其他指令碼和工具。缺點是 PROCESSLIST 資料表的 info 欄總是被截斷,因此它不能提供較長査詢的完整査詢。
查詢 MySQL PROCESSLIST 資料表
査詢 PROCESSLIST 資料表的方法是從 MySQL 的互動模式提示字元中執行「show processlist;」查詢。與執行其他査詢一樣,Navicat 使用者可以在 SQL 編輯器中直接執行 show processlist 査詢:
請注意,有時需要在命令中加入「full」修飾詞才能停用 Info 欄的截斷(檢視長査詢時,這是必需的。)
使用監控工具
為了更深入地分析査詢效能,許多專業資料庫管理員(DBA)會使用資料庫監控器,如 Navicat Monitor。它有一個查詢分析器,可以即時監控査詢,以快速提高伺服器的效能和效率。它顯示所有執行査詢的摘要資訊,並應讓你輕鬆發現有問題的査詢。如下圖所示,Navicat Monitor 可以根據執行時間排序査詢,以便一眼就能找到最慢的査詢:
總結
在這篇文章中,我們學習了一些使用 MySQL PROCESSLIST 資料表和 Navicat Monitor 識別慢速査詢的簡單方法。