如何對(duì)MySQL服務(wù)器進(jìn)行調(diào)優(yōu)
如今,社會(huì)講求的就是快速,什么事都要有效率,當(dāng)然MySQL服務(wù)器也是要有效率。開(kāi)發(fā)人員不斷地開(kāi)發(fā)和部署使用LAMP(Linux?、Apache、MySQL 和 PHP/Perl)架構(gòu)的應(yīng)用程序。但是,服務(wù)器管理員常常對(duì)應(yīng)用程序本身沒(méi)有什么控制能力,因?yàn)閼?yīng)用程序是別人編寫(xiě)的。本文重點(diǎn)討論為實(shí)現(xiàn)***效率而對(duì)數(shù)據(jù)庫(kù)層進(jìn)行的調(diào)優(yōu)。
有3種方法可以加快MySQL服務(wù)器的運(yùn)行速度,效率從低到高依次為:
***種方法時(shí)替換有問(wèn)題的硬件。對(duì)MySQL進(jìn)程的設(shè)置進(jìn)行調(diào)優(yōu)。對(duì)查詢(xún)進(jìn)行優(yōu)化。
替換有問(wèn)題的硬件通常是我們的***考慮,主要原因是數(shù)據(jù)庫(kù)會(huì)占用大量資源。不過(guò)這種解決方案也就僅限于此了。實(shí)際上,您通??梢宰屩醒胩幚砥鳎–PU)或磁盤(pán)速度加倍,也可以讓內(nèi)存增大4到8倍。
第二種方法是對(duì)MySQL服務(wù)器(也稱(chēng)為mysqld)進(jìn)行調(diào)優(yōu)。
對(duì)這個(gè)進(jìn)程進(jìn)行調(diào)優(yōu)意味著適當(dāng)?shù)胤峙鋬?nèi)存,并讓 mysqld 了解將會(huì)承受何種類(lèi)型的負(fù)載。加快磁盤(pán)運(yùn)行速度不如減少所需的磁盤(pán)訪問(wèn)次數(shù)。類(lèi)似地,確保 MySQL 進(jìn)程正確操作就意味著它花費(fèi)在服務(wù)查詢(xún)上的時(shí)間要多于花費(fèi)在處理后臺(tái)任務(wù)(如處理臨時(shí)磁盤(pán)表或打開(kāi)和關(guān)閉文件)上的時(shí)間。對(duì)mysqld進(jìn)行調(diào)優(yōu)是本文的重點(diǎn)。
***的方法是確保查詢(xún)已經(jīng)進(jìn)行了優(yōu)化。這意味著對(duì)表應(yīng)用了適當(dāng)?shù)乃饕樵?xún)是按照可以充分利用MySQL功能的方式來(lái)編寫(xiě)的。盡管本文并沒(méi)有包含查詢(xún)調(diào)優(yōu)方面的內(nèi)容(很多著作中已經(jīng)針對(duì)這個(gè)主題進(jìn)行了探討),不過(guò)它會(huì)配置mysqld來(lái)報(bào)告可能需要進(jìn)行調(diào)優(yōu)的查詢(xún)。
雖然已經(jīng)為這些任務(wù)指派了次序,但是仍然要注意硬件和mysqld的設(shè)置以利于適當(dāng)?shù)卣{(diào)優(yōu)查詢(xún)。機(jī)器速度慢也就罷了,我曾經(jīng)見(jiàn)過(guò)速度很快的機(jī)器在運(yùn)行設(shè)計(jì)良好的查詢(xún)時(shí)由于負(fù)載過(guò)重而失敗,因?yàn)閙ysqld被大量繁忙的工作所占用而不能服務(wù)查詢(xún)。
第三種方法是記錄慢速查詢(xún)
在一個(gè)SQL服務(wù)器中,數(shù)據(jù)表都是保存在磁盤(pán)上的。索引為服務(wù)器提供了一種在表中查找特定數(shù)據(jù)行的方法,而不用搜索整個(gè)表。當(dāng)必須要搜索整個(gè)表時(shí),就稱(chēng)為表掃描。通常來(lái)說(shuō),您可能只希望獲得表中數(shù)據(jù)的一個(gè)子集,因此全表掃描會(huì)浪費(fèi)大量的磁盤(pán)I/O,因此也就會(huì)浪費(fèi)大量時(shí)間。當(dāng)必須對(duì)數(shù)據(jù)進(jìn)行連接時(shí),這個(gè)問(wèn)題就更加復(fù)雜了,因?yàn)楸仨氁獙?duì)連接兩端的多行數(shù)據(jù)進(jìn)行比較。
當(dāng)然,表掃描并不總是會(huì)帶來(lái)問(wèn)題;有時(shí)讀取整個(gè)表反而會(huì)比從中挑選出一部分?jǐn)?shù)據(jù)更加有效(服務(wù)器進(jìn)程中查詢(xún)規(guī)劃器用來(lái)作出這些決定)。如果索引的使 用效率很低,或者根本就不能使用索引,則會(huì)減慢查詢(xún)速度,而且隨著服務(wù)器上的負(fù)載和表大小的增加,這個(gè)問(wèn)題會(huì)變得更加顯著。執(zhí)行時(shí)間超過(guò)給定時(shí)間范圍的查詢(xún)就稱(chēng)為慢速查詢(xún)。
您可以配置 mysqld 將這些慢速查詢(xún)記錄到適當(dāng)命名的慢速查詢(xún)?nèi)罩局?。管理員然后會(huì)查看這個(gè)日志來(lái)幫助他們確定應(yīng)用程序中有哪些部分需要進(jìn)一步調(diào)查。清單1給出了要啟用慢速查詢(xún)?nèi)罩拘枰趍y.cnf中所做的配置。
清單1.啟用MySQL慢速查詢(xún)?nèi)罩?/strong>
以下為引用的內(nèi)容:
[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
這三個(gè)設(shè)置一起使用,可以記錄執(zhí)行時(shí)間超過(guò)5秒和沒(méi)有使用索引的查詢(xún)。請(qǐng)注意有關(guān) log-queries-not-using-indexes 的警告:您必須使用 MySQL 4.1 或更高版本。慢速查詢(xún)?nèi)罩径急4嬖?MySQL 數(shù)據(jù)目錄中,名為 hostname-slow.log。如果希望使用一個(gè)不同的名字或路徑,可以在my.cnf中使用log-slow-queries = /new/path/to/file 實(shí)現(xiàn)此目的。
閱讀慢速查詢(xún)?nèi)罩?**是通過(guò)mysqldumpslow命令進(jìn)行。指定日志文件的路徑,就可以看到一個(gè)慢速查詢(xún)的排序后的列表,并且還顯示了它們?cè)谌罩疚募谐霈F(xiàn)的次數(shù)。一個(gè)非常有用的特性是mysqldumpslow在比較結(jié)果之前,會(huì)刪除任何用戶(hù)指定的數(shù)據(jù),因此對(duì)同一個(gè)查詢(xún)的不同調(diào)用被計(jì)為一次;這可以幫助找出需要工作量最多的查詢(xún)。
上文中介紹的方法技巧,希望大家能夠靈活掌握,靈活運(yùn)用,不要死板硬套。
【編輯推薦】