資料庫正規化 MySQL 資料庫監控

調整組態、優化SQL指令 動手找回MySQL效能

2018-05-14
MySQL在運作一段時間之後,執行效能無可避免地都會慢慢下滑,其實透過組態設定就能夠找回原本的運作效能。而使用MySQL本身內建的指令,則可以隨時分析SQL指令的效能。如果嫌指令繁雜難記,只要使用開源工具mytop,就能夠即時監控MySQL伺服器的運行狀態。

此時,可能就要懷疑是資料庫程式的撰寫方式造成系統效能低下。利用一些方法找出造成效能瓶頸的程式碼,並改寫相關的程式碼,即可能達到意想不到的效能提升。

當應用系統運作一段時間後,可以利用如圖8中的指令來得知應用系統在資料庫主要操作的動作。圖8顯示了目前資料庫被操作新增(Insert)、刪除(Delete)、查詢(Select)、更新(Update)等動作的次數。


▲圖8 查詢應用系統在資料庫內主要操作的動作。

可以利用此類資料來得知應用系統的特性,或許可考慮根據其特性來選擇適當的資料庫引擎,例如以Log收集系統為例,此類系統通常大多以新增動作為主,或許就可以考慮使用過去曾介紹過的tokuDB類型資料庫引擎來儲存資料。

接下來,利用MySQL伺服器所提供的慢查詢(Slow Query)記錄功能尋找需要長時間占用伺服器來處理的SQL指令,這些SQL指令往往就是拖慢資料庫效能的元凶。如果能優化此類SQL指令,通常都會得到不錯的效能提升效果。

MySQL伺服器提供了下列的變數來啟動慢查詢的功能,分別加以說明:

slow_query_log =[1||0]

設定是否要啟動慢查詢的功能,設定值為1,表示啟動慢查詢功能,設定值為0,則代表不啟動慢查詢功能。

slow_query_log_file= [檔案名稱]

設定要儲存慢查詢資訊所在的檔案名稱。

long_query_time = [秒數]

設定執行時間的門檻值(單位為秒),當SQL指令執行時間超過所設定的門檻值時,即會記錄此SQL指令的資訊。

可以到my.cnf組態檔中,來設定下列的組態:

slow_query_log = 1
slow_query_log_file=/tmp/log-slow-queries.log
long_query_time = 2
在重新啟動MySQL伺服器後,可利用如圖9中的指令來確認慢查詢功能是否啟動,slow_query_log ON即表示啟動慢查詢功能。


▲圖9 確認慢查詢功能是否啟動。

此時,如果SQL指令有執行時間超過門檻值(本例為2秒)的情況發生,就會記錄該SQL指令,記錄內容如圖10所示。其中,query_time表示所執行的時間。


▲圖10 SQL指令執行時間超過門檻值時,就會記錄該SQL指令。

在取得會造成MySQL伺服器效能低下的SQL指令後,接下來可利用explain指令來分析此指令的效能,圖11所示為分析一個簡單SQL指令的範例,相關欄位簡單說明如下:


▲圖11 分析SQL指令的內容。

select_type: 表示查詢(Select)的類型,SIMPLE表示僅是單純的表格查詢,亦即不使用表連接(Join)或子查詢(Subquery)等較為複雜的查詢。

table:用來查詢的資料庫表格名稱。

type: 查詢所使用的方式,提供如下的常見方式(效能由最差至最好),可藉由此欄位的資訊來確認SQL子句是否用較佳的效能查詢:

‧ALL:全資料表格掃描,資料庫須搜尋整個資料表格後,才能取得使用者所需要的資訊,此種搜尋方式的效能最差。

‧Index:資料庫搜尋整個資料表格的索引來取得使用者所需要的資訊。

‧Range:為範圍掃描,通常用於如<、<=、>、>=、between等限定範圍的操作上。

‧ref:回傳匹配某個欄位值的紀錄,通常以此類查詢來回傳多個紀錄。

‧const/system:使用者所執行的查詢條件,最多僅會回傳一筆紀錄。通常會用在主鍵(Primary Key)的查詢上。

‧NULL:表示不需要任何資料庫表格或索引,就能直接得到使用者所需要的資料,此為最為效率的搜尋方式,例如使用類似Select 1的查詢方式。

possible_keys: 表示資料庫在執行查詢指令時,可能會使用的索引。

key: 表示資料庫在執行查詢指令時,實際使用到的索引。

key_len:實際使用到的索引的長度。

rows: 表示資料庫在執行查詢指令時,所掃描到的紀錄數量。

Extra:執行情況的額外說明。


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!