普通的MySQL用戶利用表建立和索引操做,以及利用查詢的編寫可以進行的優化。不過,還有一些只能由MySQL管理員和系統管理員來完成的優化,這些管理員在MySQL服務器或運行MySQL的機器上具備控制權。有的服務器參數直接適用於查詢處理,可將它們打開。而有的硬件配置問題直接影響查詢處理速度,應該對它們進行調整。node
磁盤問題數據庫
正如前面所述,磁盤尋道是一個性能的大瓶頸。當數據開始增加以至緩存變得不可能時,這個問題變得愈來愈明顯。對大數據庫,在那你或多或少地要隨機存取數據,你能夠依靠你將至少須要一次磁盤尋道來讀取而且幾回磁盤尋道寫入。爲了使這個問題最小化,使用有低尋道時間的磁盤。緩存
爲了增長可用磁盤軸的數量(而且從而減小尋道開銷),符號聯接文件到不一樣磁盤或分割磁盤是可能的。服務器
一、使用符號鏈接ide
這意味着你將索引/數據文件符號從正常的數據目錄連接到其餘磁盤(那也能夠被分割的)。這使得尋道和讀取時間更好(若是磁盤不用於其餘事情)函數
二、分割性能
分割意味着你有許多磁盤並把第一塊放在第一個磁盤上,在第二塊放在第二個磁盤上,而且第n塊在第(nmodnumber_of_disks)磁盤上,等等。這意味着,若是你的正常數據大小於分割大小(或完美地排列過),你將獲得較好一些的性能。注意,分割是否很依賴於OS和分割大小。所以用不一樣的分割大小測試你的應用程序。見10.8使用你本身的基準。注意對分割的速度差別很依賴於參數,取決於你如何分割參數和磁盤數量,你能夠得出以數量級的不一樣。注意你必須選擇爲隨機或順序存取優化。測試
爲了可靠,你可能想要使用襲擊RAID0+1(分割+鏡像),可是在這種狀況下,你將須要2*N個驅動器來保存N個驅動器的數據。若是你有錢,這多是最好的選擇!然而你也可能必須投資一些卷管理軟件投資以高效地處理它。大數據
一個好選擇是讓稍重要的數據(它能再生)上存在RAID0磁盤上,而將確實重要的數據(像主機信息和日誌文件)存在一個RAID0+1或RAIDN磁盤上。若是由於更新奇偶位你有許多寫入,RAIDN多是一個問題。優化
你也能夠對數據庫使用的文件系統設置參數。一個容易的改變是以noatime選項掛裝文件系統。這是它跳過更新在inode中的最後訪問時間,並且這將避免一些磁盤尋道。
硬件問題
可利用硬件更有效地改善服務器的性能:
一、在機器中安裝更多的內存。這樣可以增長服務器的高速緩存和緩衝區的尺寸,使服務器更常常地使用存放在內存中的信息,下降從磁盤取信息的要求。
二、若是有足夠的RAM使全部交換在內存文件系統中完成,那麼應該從新配置系統,去掉全部磁盤交換設置。不然,即便有足以知足交換的RAM,某些系統仍然要與磁盤進行交換。
三、增長更快的磁盤以減小I/O等待時間。尋道時間是這裏決定性能的主要因素。逐字地移動磁頭是很慢的,一旦磁頭定位,從磁道讀塊則較快。
四、在將數據從新放到不一樣設備以前,應該保證瞭解該系統的裝載特性。若是在特定的物理設備上已經有了某些特定的主要活動,將數據庫放到該處實際上可能會使性能更壞。例如,不要把數據庫移處處理大量Web通訊的Web服務器設備上。
五、在設置MySQL時,應該配置其使用靜態庫而不是共享庫。使用共享庫的動態二進制系統可節省磁盤空間,但靜態二進制系統更快(然而,若是但願裝入用戶自定義的函數,則不能使用靜態二進制系統,由於UDF機制依賴於動態鏈接)。
服務器參數的選擇
服務器有幾個可以改變從而影響其操做的參數(或稱變量)。系統變量的當前值能夠經過執行MySQLadminvaribles命令來檢查,其中幾個參數主要與查詢有關,有必要在此提一下:
delayed_queue_size此參數在執行其餘INSERTDELAYED語句的客戶機阻塞之前,肯定來自INSERTDELAYED語句的放入隊列的行的數目。增長這個參數的值使服務器能從這種請求中接收更多的行,於是客戶機能夠繼續執行而不阻塞。
key_buffer_size此參數爲用來存放索引塊的緩衝區尺寸。若是內存多,增長這個值能節省索引建立和修改的時間。較大的值使MySQL能在內存中存儲更多的索引塊,這樣增長了在內存中找到鍵值而不用讀磁盤塊的可能性。
在MySQL3.23版及之後的版本中,若是增長了鍵緩衝區的尺寸,可能還但願用——init-file選項啓動服務器。這樣可以指定一個服務器啓動時執行的SQL語句文件。若是有想要存放在內存中的只讀表,可將它們拷貝到索引查找很是快的HEAP表。