MySQL在運作一段時間之後,執行效能無可避免地都會慢慢下滑,其實透過組態設定就能夠找回原本的運作效能。而使用MySQL本身內建的指令,則可以隨時分析SQL指令的效能。如果嫌指令繁雜難記,只要使用開源工具mytop,就能夠即時監控MySQL伺服器的運行狀態。
如果提到開源碼社群中的資料庫解決方案,相信許多人腦海裡第一個浮現的念頭應該就是MySQL。MySQL挾著其優異的性能,早已成為開源碼資料庫解決方案的首選,最常見的即是運用在網站服務上。
但網站管理員應該也常有這樣的經驗,在上線的初期,運作都相當地順暢,但隨著資料的累積,會慢慢地發現網站運作似乎越來越不順,常常都會有延遲的情況發生。追究其原因,問題往往不是出在網站伺服器或網路,而是因為資料庫的運作效能,導致資料庫無法即時地回饋資料給網站伺服器,使得網站伺服器無法順利完成使用者的需求。
因此,本文將簡單說明如何利用組態設定來提升MySQL的運作效能,並利用MySQL(在此使用5.7.16版)所提供的指令來分析SQL指令的效能。最後,再簡介一套即時監控MySQL伺服器狀態的工具程式mytop,協助使用者即時監控MySQL伺服器的狀態。
一般在設計資料庫應用系統時,除了必須進行資料庫正規化(Normalization)來減少資料庫中冗餘的資料及增進資料庫內的資料一致性外,另一個不可或缺的考量點是必須依據此資料庫應用系統的特性來選擇不同的資料庫引擎以儲存資料。
例如,金融機構的資料庫系統特別注重交易的安全,在此前提下,就必須採用支援交易(Transaction)功能的資料庫引擎或是一些要求運算速度的系統,這樣就可以利用記憶體型式的資料庫引擎來增進運算的效能。
MySQL為此提供了多種類型的資料庫引擎來因應使用者不同的使用需求,管理者可以先使用MySQL程式登入MySQL伺服器,再利用「show engines」指令來取得伺服器所支援的資料庫引擎。如圖1所示。
|
▲圖1 利用show engines指令來查詢伺服器可支援的資料庫引擎。 |
認識MySQL資料庫引擎
接下來,簡單說明幾種MySQL伺服器內建的資料庫引擎,分析其個別的類型與特性。
MyISAM
MyISAM為早期MySQL伺服器所支援的資料庫引擎之一,其主要的優點在於執行速度較快,但此種資料庫引擎類型並不支援交易功能,接下來簡單地說明何謂「交易」。
假如要完成一次交易,可能需要多次的資料庫動作(如新增或更新)才能完成。交易機制須確保當所需要的資料庫動作均成功執行後,才能以提交(Commit)的方式來完成此項交易並實際執行資料庫動作,反之,如果在執行中發生問題,以致於無法完成交易,即可利用回復(Rollback)的方式,將資料庫回復到交易之前的狀態。
如果不需要較嚴謹的交易功能,而僅需簡單的資料庫動作(如查詢或新增)的應用,就可選用此種資料庫引擎類型(存取效率會較好)。在建立MyISAM資料表後,便會在磁碟上新增如下類型的檔案:
‧ frm:此檔案儲存資料庫表格的定義。
‧ myd:此檔案儲存資料庫表格內的紀錄資料。
‧ myi: 此檔案儲存資料庫表格內索引(Index)的資料。
如果使用的MySQL伺服器為5.5之前的版本,當新建資料庫時,就會預設使用MyISAM資料庫引擎類型,而之後的版本預設為InnoDB資料庫引擎類型。
InnoDB
InnoDB資料庫引擎提供交易安全的機制,可在交易所需要的資料庫動作完成後,以提交的方式執行交易,並在交易失敗後,提供回復功能來復原之前所執行的資料庫動作,此種的資料庫類型通常是運用在對於交易的完整性有嚴格要求的應用上。
Memory
相信沒有人可以否認,就純粹以運算速度做比較,記憶體(Memory)的速度是遠超過以磁碟來運算的速度,因此MySQL伺服器特別提供了記憶體類型的資料庫引擎。使用記憶體來當成資料庫表格的儲存空間,最大的好處是運算速度快。但由於記憶體的揮發特性,一旦系統關機,所有儲存在記憶體內的資料庫表格紀錄也會隨之被抹除。而另外一個缺點是,其所可儲存資料的容量遠小於以磁碟來儲存的方式,所以此類的資料庫引擎僅適用於快速運算且不需太大空間的運用上。
在了解MySQL伺服器常見的資料庫引擎簡單的特性後,接下來繼續探討怎樣以適當調整系統參數的方式來增進伺服器的效能。
活用MySQL系統參數
MySQL提供了相關的系統參數組態,讓使用者可藉由設定相關系統參數的方式來增進MySQL伺服器的運作效能。