熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

Linux環境MySQL服務器級優化講解

2013-11-23 20:58:53  來源: MySQL 

  摘要本節簡單介紹了如何在服務器級優化數據庫的性能以及提高數據庫性能涉及到的硬件問題選擇一個盡量快的系統使用RAID磁盤陣列是非常容易想到的方法對於數據庫守護程序既可以在編譯時就提供合適的參數也可以在選項文件中提供需要優化的參數

  前面各段介紹了普通的 MySQL 用戶利用表創建和索引操作以及利用查詢的編寫能夠進行的優化不過還有一些只能由 MySQL 管理員和系統管理員來完成的優化這些管理員在 MySQL 服務器或運行 MySQL 的機器上具有控制權有的服務器參數直接適用於查詢處理可將它們打開而有的硬件配置問題直接影響查詢處理速度應該對它們進行調整

  磁盤問題

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

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

  使用符號連接

  這意味著你將索引/數據文件符號從正常的數據目錄鏈接到其他磁盤(那也可以被分割的)這使得尋道和讀取時間更好(如果磁盤不用於其他事情)

  分割

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

  為了可靠你可能想要使用襲擊RAID +(分割+鏡像)但是在這種情況下你將需要*N個驅動器來保存N個驅動器的數據如果你有錢這可能是最好的選擇!然而你也可能必須投資一些卷管理軟件投資以高效地處理它

  一個好選擇是讓稍重要的數據(它能再生)上存在RAID 磁盤上而將確實重要的數據(像主機信息和日志文件)存在一個RAID +或RAID N磁盤上如果因為更新奇偶位你有許多寫入RAID N可能是一個問題

  你也可以對數據庫使用的文件系統設置參數一個容易的改變是以noatime選項掛裝文件系統這是它跳過更新在inode中的最後訪問時間而且這將避免一些磁盤尋道

  硬件問題

  可利用硬件更有效地改善服務器的性能

  在機器中安裝更多的內存這樣能夠增加服務器的高速緩存和緩沖區的尺寸使服務器更經常地使用存放在內存中的信息降低從磁盤取信息的要求

  如果有足夠的 RAM 使所有交換在內存文件系統中完成那麼應該重新配置系統去掉所有磁盤交換設置否則即使有足以滿足交換的 RAM某些系統仍然要與磁盤進行交換

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

  在不同的物理設備上設法重新分配磁盤活動如果可能應將您的兩個最繁忙的數據庫存放在不同的物理設備上請注意使用同一物理設備上的不同分區是不夠的這樣沒有幫助因為它們仍將爭用相同的物理資源(磁盤頭)移動數據庫的過程在第 章中介紹

  在將數據重新放到不同設備之前應該保證了解該系統的裝載特性如果在特定的物理設備上已經有了某些特定的主要活動將數據庫放到該處實際上可能會使性能更壞例如不要把數據庫移到處理大量Web 通信的Web 服務器設備上

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

  服務器參數的選擇

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

  delayed_queue_size

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

  key_buffer_size

  此參數為用來存放索引塊的緩沖區尺寸如果內存多增加這個值能節省索引創建和修改的時間較大的值使 MySQL 能在內存中存儲更多的索引塊這樣增加了在內存中找到鍵值而不用讀磁盤塊的可能性

  在 MySQL 版及以後的版本中如果增加了鍵緩沖區的尺寸可能還希望用 initfile 選項啟動服務器這樣能夠指定一個服務器啟動時執行的 SQL 語句文件如果有想要存放在內存中的只讀表可將它們拷貝到索引查找非常快的 HEAP 表

  back_log

  引入客戶機連接請求的數量這些請求在從當前客戶機中處理時排隊如果你有一個很忙的站點可以增加改變量的值

  編譯和鏈接怎樣影響MySQL的速度

  大多數下列測試在Linux上並用MySQL基准進行的但是它們應該對其他操作系統和工作負載給出一些指示

  當你用static鏈接時你得到最快的可執行文件使用Unix套接字而非TCP/IP連接一個數據庫也可給出好一些的性能

  在Linux上當用pgcc和O編譯時你將得到最快的代碼為了用這些選項編譯你需要大約M內存因為gcc/pgcc需要很多內存使所有函數嵌入(inline)在配置MySQL時你也應該設定CXX=gcc以避免包括libstdc++庫(它不需要)

  只通過使用一個較好的編譯器或較好的編譯器選項在應用中你能得到一個%的加速如果你自己編譯SQL服務器這特別重要!

  在Intel上你應該例如使用pgcc或Cygnus CodeFusion編譯器得到最大速度我們已經測試了新的 Fujitsu編譯器但是它是還沒足夠不出錯來優化編譯MySQL

  這裡是我們做過的一些測量表

  ·如果你以O使用pgcc並且編譯任何東西mysqld服務器是比用gcc快%(用字符串的版本)

  ·如果你動態地鏈接(沒有static)結果慢了%注意你仍能使用一個動態連接的MySQL庫只有服務器對性能是關鍵的

  ·如果你使用TCP/IP而非Unix套接字結果慢%

  ·在一個Sun SPARCstation gcc是比Sun Pro C++ %

  ·在Solaris 在單個處理器上MITpthreads比帶原生線程的Solaris慢%以更多的負載/cpus差別應該變得更大

  由TcX提供的MySQLLinux的分發用pgcc編譯並靜態鏈接

  總結

  本節簡單介紹了如何在服務器級優化數據庫的性能以及提高數據庫性能涉及到的硬件問題選擇一個盡量快的系統使用RAID磁盤陣列是非常容易想到的方法

  對於數據庫守護程序既可以在編譯時就提供合適的參數也可以在選項文件中提供需要優化的參數

  思考題

  使用ANALYSE過程分析語句SELECT * FROM pet判斷是否有必要改變列的類型

  現在讓你需要優化表pet可以用那些手段做到?


From:http://tw.wingwit.com/Article/program/MySQL/201311/29375.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.