LAMP系統(tǒng)MySQL數(shù)據(jù)庫(kù)服務(wù)器優(yōu)化技巧:替換有問(wèn)題的硬件
LAMP系統(tǒng)MySQL數(shù)據(jù)庫(kù)服務(wù)器優(yōu)化技巧:替換有問(wèn)題的硬件
替換有問(wèn)題的硬件通常是我們的***考慮,主要原因是數(shù)據(jù)庫(kù)會(huì)占用大量資源。不過(guò)這種解決方案也就僅限于此了。實(shí)際上,您通??梢宰屩醒胩幚砥?CPU)或磁盤(pán)速度加倍,也可以讓內(nèi)存增大 4 到 8 倍。
記錄慢速查詢
在一個(gè) SQL 服務(wù)器中,數(shù)據(jù)表都是保存在磁盤(pán)上的。索引為服務(wù)器提供了一種在表中查找特定數(shù)據(jù)行的方法,而不用搜索整個(gè)表。當(dāng)必須要搜索整個(gè)表時(shí),就稱為表掃描。通常來(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)程中查詢規(guī)劃器用來(lái)作出這些決定)。如果索引的使用效率很低,或者根本就不能使用索引,則會(huì)減慢查詢速度,而且隨著服務(wù)器上的負(fù)載和表大小的增加,這個(gè)問(wèn)題會(huì)變得更加顯著。執(zhí)行時(shí)間超過(guò)給定時(shí)間范圍的查詢就稱為慢速查詢。
您可以配置 mysqld 將這些慢速查詢記錄到適當(dāng)命名的慢速查詢?nèi)罩局?。管理員然后會(huì)查看這個(gè)日志來(lái)幫助他們確定應(yīng)用程序中有哪些部分需要進(jìn)一步調(diào)查。清單 1 給出了要啟用慢速查詢?nèi)罩拘枰?my.cnf 中所做的配置。
清單 1. 啟用 MySQL 慢速查詢?nèi)罩?/p>
- [mysqld]
- enable the slow query log, default 10 seconds
- log-slow-queries
- log queries taking longer than 5 seconds
- long_query_time = 5
- log queries that don't use indexes even if they take less than long_query_time
- MySQL 4.1 and newer only
- log-queries-not-using-indexes
這三個(gè)設(shè)置一起使用,可以記錄執(zhí)行時(shí)間超過(guò) 5 秒和沒(méi)有使用索引的查詢。請(qǐng)注意有關(guān) log-queries-not-using-indexes 的警告:您必須使用 MySQL 4.1 或更高版本。慢速查詢?nèi)罩径急4嬖?MySQL 數(shù)據(jù)目錄中,名為 hostname-slow.log。如果希望使用一個(gè)不同的名字或路徑,可以在 my.cnf 中使用 log-slow-queries = /new/path/to/file 實(shí)現(xiàn)此目的。
閱讀慢速查詢?nèi)罩?**是通過(guò) mysqldumpslow 命令進(jìn)行。指定日志文件的路徑,就可以看到一個(gè)慢速查詢的排序后的列表,并且還顯示了它們?cè)谌罩疚募谐霈F(xiàn)的次數(shù)。一個(gè)非常有用的特性是 mysqldumpslow 在比較結(jié)果之前,會(huì)刪除任何用戶指定的數(shù)據(jù),因此對(duì)同一個(gè)查詢的不同調(diào)用被計(jì)為一次;這可以幫助找出需要工作量最多的查詢。
【編輯推薦】