如今,開發人員不斷地開發和部署使用LAMP(Linux?、Apache、MySQL 和 PHP/Perl)架構的應用程式。但是,伺服器管理員常常對應用程式本身沒有什麼控制能力,因為應用程式是別人編寫的。本文重點討論為實現最高效率而對資料庫層進行的調優。
有3種方法可以加快MySQL伺服器的運行速度,效率從低到高依次為:
替換有問題的硬體。對MySQL進程的設定進行調優。對查詢進行最佳化。
替換有問題的硬體通常是我們的第一考慮,主要原因是資料庫會佔用大量資源。不過這種解決方案也就僅限於此了。實際上,您通常可以讓中央處理器(CPU)或磁碟速度加倍,也可以讓記憶體增大4到8倍。
第二種方法是對MySQL伺服器(也稱為mysqld)進行調優。對這個進程進行調優意味著適當地分配記憶體,並讓 mysqld 瞭解將會承受何種類型的負載。加快磁碟運行速度不如減少所需的磁碟訪問次數。類似地,確保 MySQL 進程正確操作就意味著它花費在服務查詢上的時間要多於花費在處理背景工作(如處理臨時磁碟表或開啟和關閉檔案)上的時間。對mysqld進行調優是本文的重點。
最好的方法是確保查詢已經進行了最佳化。這意味著對錶應用了適當的索引,查詢是按照可以充分利用MySQL功能的方式來編寫的。儘管本文並沒有包含查詢調優方面的內容(很多著作中已經針對這個主題進行了探討),不過它會配置mysqld來報告可能需要進行調優的查詢。
雖然已經為這些任務指派了次序,但是仍然要注意硬體和mysqld的設定以利於適當地調優查詢。機器速度慢也就罷了,我曾經見過速度很快的機器在運行設計良好的查詢時由於負載過重而失敗,因為mysqld被大量繁忙的工作所佔用而不能服務查詢。
記錄慢速查詢
在一個SQL伺服器中,資料表都是儲存在磁碟上的。索引為伺服器提供了一種在表中尋找特定資料行的方法,而不用搜尋整個表。當必須要搜尋整個表時,就稱為表掃描。通常來說,您可能只希望獲得表中資料的一個子集,因此全表掃描會浪費大量的磁碟I/O,因此也就會浪費大量時間。當必須對資料進行串連時,這個問題就更加複雜了,因為必須要對串連兩端的多行資料進行比較。
當然,表掃描並不總是會帶來問題;有時讀取整個表反而會比從中挑選出一部分資料更加有效(伺服器處理序中查詢規劃器用來作出這些決定)。如果索引的使 用效率很低,或者根本就不能使用索引,則會減慢查詢速度,而且隨著伺服器上的負載和表大小的增加,這個問題會變得更加顯著。執行時間超過給定時間範圍的查詢就稱為慢速查詢。
您可以配置 mysqld 將這些慢速查詢記錄到適當命名的慢速查詢日誌中。管理員然後會查看這個日誌來協助他們確定應用程式中有哪些部分需要進一步調查。清單1給出了要啟用慢速查詢日誌需要在my.cnf中所做的配置。
清單1.啟用MySQL慢速查詢日誌
[mysqld]; enable the slow query log, default 10 secondslog-slow-queries; log queries taking longer than 5 secondslong_query_time = 5; log queries that don’t use indexes even if they take less than long_query_time; MySQL 4.1 and newer onlylog-queries-not-using-indexes
這三個設定一起使用,可以記錄執行時間超過5秒和沒有使用索引的查詢。請注意有關 log-queries-not-using-indexes 的警告:您必須使用 MySQL 4.1 或更高版本。慢速查詢日誌都儲存在 MySQL 資料目錄中,名為 hostname-slow.log。如果希望使用一個不同的名字或路徑,可以在my.cnf中使用log-slow-queries = /new/path/to/file 實現此目的。
閱讀慢速查詢日誌最好是通過mysqldumpslow命令進行。指定記錄檔的路徑,就可以看到一個慢速查詢的排序後的列表,並且還顯示了它們在記錄檔中出現的次數。一個非常有用的特性是mysqldumpslow在比較結果之前,會刪除任何使用者指定的資料,因此對同一個查詢的不同調用被計為一次;這可以協助找出需要工作量最多的查詢