Linux下MySQL伺服器級優化技巧

pythontab發表於2013-02-04

普通的MySQL使用者利用表建立和索引操作,以及利用查詢的編寫能夠進行的優化。不過,還有一些只能由MySQL管理員和系統管理員來完成的優化,這些管理員在MySQL伺服器或執行MySQL的機器上具有控制權。有的伺服器引數直接適用於查詢處理,可將它們開啟。而有的硬體配置問題直接影響查詢處理速度,應該對它們進行調整。

磁碟問題

正如前面所述,磁碟尋道是一個效能的大瓶頸。當資料開始增長以致快取變得不可能時,這個問題變得越來越明顯。對大資料庫,在那你或多或少地要隨機存取資料,你可以依靠你將至少需要一次磁碟尋道來讀取並且幾次磁碟尋道寫入。為了使這個問題最小化,使用有低尋道時間的磁碟。

為了增加可用磁碟軸的數量(並且從而減少尋道開銷),符號聯接檔案到不同磁碟或分割磁碟是可能的。

1、使用符號連線

這意味著你將索引/資料檔案符號從正常的資料目錄連結到其他磁碟(那也可以被分割的)。這使得尋道和讀取時間更好(如果磁碟不用於其他事情)

2、分割

分割意味著你有許多磁碟並把第一塊放在第一個磁碟上,在第二塊放在第二個磁碟上,並且第n塊在第(nmodnumber_of_disks)磁碟上,等等。這意味著,如果你的正常資料大小於分割大小(或完美地排列過),你將得到較好一些的效能。注意,分割是否很依賴於OS和分割大小。因此用不同的分割大小測試你的應用程式。見10.8使用你自己的基準。注意對分割的速度差異很依賴於引數,取決於你如何分割引數和磁碟數量,你可以得出以數量級的不同。注意你必須選擇為隨機或順序存取優化。

為了可靠,你可能想要使用襲擊RAID0+1(分割+映象),但是在這種情況下,你將需要2*N個驅動器來儲存N個驅動器的資料。如果你有錢,這可能是最好的選擇!然而你也可能必須投資一些卷管理軟體投資以高效地處理它。

一個好選擇是讓稍重要的資料(它能再生)上存在RAID0磁碟上,而將確實重要的資料(像主機資訊和日誌檔案)存在一個RAID0+1或RAIDN磁碟上。如果因為更新奇偶位你有許多寫入,RAIDN可能是一個問題。

你也可以對資料庫使用的檔案系統設定引數。一個容易的改變是以noatime選項掛裝檔案系統。這是它跳過更新在inode中的最後訪問時間,而且這將避免一些磁碟尋道。

硬體問題

可利用硬體更有效地改善伺服器的效能:

1、在機器中安裝更多的記憶體。這樣能夠增加伺服器的快取記憶體和緩衝區的尺寸,使伺服器更經常地使用存放在記憶體中的資訊,降低從磁碟取資訊的要求。

2、如果有足夠的RAM使所有交換在記憶體檔案系統中完成,那麼應該重新配置系統,去掉所有磁碟交換設定。否則,即使有足以滿足交換的RAM,某些系統仍然要與磁碟進行交換。

3、增加更快的磁碟以減少I/O等待時間。尋道時間是這裡決定效能的主要因素。逐字地移動磁頭是很慢的,一旦磁頭定位,從磁軌讀塊則較快。

4、在將資料重新放到不同裝置之前,應該保證瞭解該系統的裝載特性。如果在特定的物理裝置上已經有了某些特定的主要活動,將資料庫放到該處實際上可能會使效能更壞。例如,不要把資料庫移到處理大量Web通訊的Web伺服器裝置上。

5、在設定MySQL時,應該配置其使用靜態庫而不是共享庫。使用共享庫的動態二進位制系統可節省磁碟空間,但靜態二進位制系統更快(然而,如果希望裝入使用者自定義的函式,則不能使用靜態二進位制系統,因為UDF機制依賴於動態連線)。

伺服器引數的選擇

伺服器有幾個能夠改變從而影響其操作的引數(或稱變數)。系統變數的當前值可以通過執行MySQLadminvaribles命令來檢查,其中幾個引數主要與查詢有關,有必要在此提一下:

delayed_queue_size此引數在執行其他INSERTDELAYED語句的客戶機阻塞以前,確定來自INSERTDELAYED語句的放入佇列的行的數目。增加這個引數的值使伺服器能從這種請求中接收更多的行,因而客戶機可以繼續執行而不阻塞。

key_buffer_size此引數為用來存放索引塊的緩衝區尺寸。如果記憶體多,增加這個值能節省索引建立和修改的時間。較大的值使MySQL能在記憶體中儲存更多的索引塊,這樣增加了在記憶體中找到鍵值而不用讀磁碟塊的可能性。

在MySQL3.23版及以後的版本中,如果增加了鍵緩衝區的尺寸,可能還希望用——init-file選項啟動伺服器。這樣能夠指定一個伺服器啟動時執行的SQL語句檔案。如果有想要存放在記憶體中的只讀表,可將它們拷貝到索引查詢非常快的HEAP表。


相關文章