MySQL優化簡明指南
如果你從原始碼分發安裝MySQL,要注意,編譯過程對以後的目標程式效能有重要的影響,不同的編譯方式可能得到類似的目標檔案,但效能可能相差很大,因此,在編譯安裝MySQL適應仔細根據你的應用型別選擇最可能好的編譯選項。這種定製的MySQL可以為你的應用提供最佳效能。
技巧:選用較好的編譯器和較好的編譯器選項,這樣應用可提高效能10-30%。(MySQL文件如是說)
1.1、使用pgcc(Pentium GCC)編譯器
該編譯器(http://www.goof.com/pcg/)針對執行在奔騰處理器系統上的程式進行優化,用pgcc編譯MySQL原始碼,總體效能可提高10%。當然如果你的伺服器不是用奔騰處理器,就不必用它了,因為它是專為奔騰系統設計的。
1.2、僅使用你想使用的字符集編譯MySQL
MySQL目前提供多達24種不同的字符集,為全球使用者以他們自己的語言插入或查看錶中的資料。卻省情況下,MySQL安裝所有者這些字符集,熱然而,最好的選擇是指選擇一種你需要的。如,禁止除Latin1字符集以外的所有其它字符集:
--------------------------------------------------------------------------------
%>./configure -with-extra-charsets=none [--other-configuration-options]
--------------------------------------------------------------------------------
1.3、將mysqld編譯成靜態執行檔案
將mysqld編譯成靜態執行檔案而無需共享庫也能獲得更好的效能。通過在配置時指定下列選項,可靜態編譯mysqld。
--------------------------------------------------------------------------------
%>./configure -with-mysqld-ldflags=-all-static [--other-configuration-options]
--------------------------------------------------------------------------------
1.4、配置樣本
下列配置命令常用於提高效能:
--------------------------------------------------------------------------------
%>CFLAGS="-O6 -mpentiumpro -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -mpentiumpro -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared
--------------------------------------------------------------------------------
二、調整伺服器
確保運用正確的編譯固然重要,但這只是成功的第一步,配置眾多的MySQL變數同樣對伺服器的正常執行起關鍵作用。你可以將這些變數的賦值存在一個配置檔案中,以確保它們在每次啟動MySQL時均起作用,這個配置檔案就是my.cnf檔案。
MySQL已經提供了幾個my.cnf檔案的樣本,可在/usr/local/mysqld/share/mysql/目錄下找到。這些檔案分別命名為my-small.cnf、 my-medium.cnf、my-large.cnf和my-huge.cnf,規模說明可在描述配置檔案適用的系統型別標題中找到。如果在只有相當少記憶體的系統上執行MySQL,而且只是偶爾的用一下,那麼my-small.cnf會比較理想,因為它命令mysqld只使用最少的資源。類似地,如果你計劃構建電子商務超市,而且系統擁有2G記憶體,那麼你可能要用到mysql-huge.cnf檔案了。
為了利用這些檔案中的一個,你需要複製一個最適合需求的檔案,改名為my.cnf。你可以選擇使用配置檔案三種作用範圍的一種:
Global:將my.cnf檔案複製到伺服器的/etc目錄下,這使得配置檔案中的變數作用於全域性,即對所有伺服器上的MySQL資料庫伺服器有效。
Local:將my.cnf檔案複製到[MYSQL-INSTALL-DIR]/var/目錄下,使得my.cnf作用於特定的伺服器。[MYSQL-INSTALL-DIR]表示MySQL安裝目錄。
User:你可以再限制作用於特定的使用者,將my.cnf複製到使用者的根目錄下。
究竟如何設定my.cnf中的這些變數呢?更進一步說,你可以設定哪一個變數。雖然所用變數對MySQL伺服器相對通用,每一個變數與MySQL的的某些元件有更特定的關係。如變數max_connects歸在mysqld類別下。執行下列命令即可知道:
--------------------------------------------------------------------------------
%>/usr/local/mysql/libexec/mysqld --help
--------------------------------------------------------------------------------
它顯示大量的選項及與mysqld相關的變數。你可以很容易地在該行文字之下找出變數:
--------------------------------------------------------------------------------
Possible variables for option --set-variable (-O) are
--------------------------------------------------------------------------------
然後你可以如下設定my.cnf中的那些變數:
--------------------------------------------------------------------------------
set-variable = max_connections=100
--------------------------------------------------------------------------------
它設定MySQL伺服器的最大併發連線數為100。要確保在my.cnf檔案中的[mysqld]標題下插入變數設定。
三、表型別
很多MySQL使用者可能很驚訝,MySQL確實為使用者提供5種不同的表型別,稱為DBD、HEAP、ISAM、MERGE和MyIASM。DBD歸為事務安全類,而其他為非事務安全類。
3.1、事務安全
DBD
Berkeley DB(DBD)表是支援事務處理的表,由Sleepycat軟體公司(http://www.sleepycat.com)開發。它提供MySQL使用者期待已久的功能-事務控制。事務控制在任何資料庫系統中都是一個極有價值的功能,因為它們確保一組命令能成功地執行。
3.2、非事務安全
HEAP
HEAP表是MySQL中存取資料最快的表。這是因為他們使用儲存在動態記憶體中的一個雜湊索引。另一個要點是如果MySQL或伺服器崩潰,資料將丟失。
ISAM
ISAM表是早期MySQL版本的預設表型別,直到MyIASM開發出來。建議不要再使用它。
MERGE
MERGE是一個有趣的新型別,在3.23.25之後出現。一個MERGE表實際上是一個相同MyISAM表的集合,合併成一個表,主要是為了效率原因。這樣可以提高速度、搜尋效率、修復效率並節省磁碟空間。
MyIASM
這是MySQL的預設表型別。它基於IASM程式碼,但有很多有用的擴充套件。MyIASM比較好的原因:
MyIASM表小於IASM表,所以使用較少資源。
MyIASM表在不同的平臺上二進位制層可移植。
更大的鍵碼尺寸,更大的鍵碼上限。
3.3、指定表型別
你可在建立表時指定表的型別。下例建立一個HEAP表:
--------------------------------------------------------------------------------
mysql>CREATE TABLE email_addresses TYPE=HEAP (
->email char(55) NOT NULL,
->name char(30) NOT NULL,
->PRIMARY KEY(email) );
--------------------------------------------------------------------------------
BDB表需要一些配置工作,參見http://www.mysql.com/doc/B/D/BDB_overview.html。
3.4、更多的表型別
為了使MySQL管理工作更有趣,即將釋出的MySQL 4.0將提供兩種新的表型別,稱為Innobase和Gemeni。
4、優化工具
MySQL伺服器本身提供了幾條內建命令用於幫助優化。
4.1、SHOW
你可能有興趣知道MySQL伺服器究竟更了什麼,下列命令給出一個總結:
--------------------------------------------------------------------------------
mysql>show status;
--------------------------------------------------------------------------------
它給出了一個相當長的狀態變數及其值的列表。有些變數包含了異常終止客戶的數量、異常終止連線的數量、連線嘗試的次數、最大併發連線數和大量其他有用的資訊。這些資訊對找出系統問題和低效極具價值。
SHOW還能做更多的事情。它可以顯示關於日誌檔案、特定資料庫、表、索引、程序和許可權表中有價值的資訊。詳見MySQL手冊。
4.2、EXPLAIN
當你面對SELECT語句時,EXPLAIN解釋SELECT命令如何被處理。這不僅對決定是否應該增加一個索引,而且對決定一個複雜的Join如何被MySQL處理都是有幫助的。
4.3、OPTIMIZE
OPTIMIZE語句允許你恢復空間和合並資料檔案碎片,對包含變長行的表進行了大量更新和刪除後,這樣做特別重要。OPTIMIZE目前只工作於MyIASM和BDB表。
(http://www.fanqiang.com)