MySQL實際上支持五種不同的表類型,有些人可能會對此感到不同尋常。這五種類型分別是BDB、HEAP、ISAM、MERGE以及MyISAM。其中BDB類型單獨屬于一類,稱為“事務安全型”(transaction-safe),其余的表類型屬于第二類,稱為“非事務安全型”(non-transaction-safe)。下面我們詳細介紹這些表類型。
事務安全型
▲ BDB
BDB全稱是“Berkeley DB”,它是MySQL具有事務能力的表類型,由Sleepycat Software (
http://www.sleepycat.com)開發。BDB表類型提供了MySQL用戶長久期盼的功能,即事務控制能力。在任何RDBMS中,事務控制能力都是一種極其重要和寶貴的功能。事務控制能力使得我們能夠確保一組命令確實已經全部執行成功,或者確保當任何一個命令出現錯誤時所有命令的執行結果均被回退??梢韵胂?,在電子銀行這類應用中事務控制能力是極其重要的。
非事務安全型
▲ HEAP
HEAP表是訪問數據速度最快的MySQL表,這是因為這類表使用保存在內存中的散列索引。但有極其重要的一點必須注意,如果MySQL或者服務器崩潰,HEAP表中的數據將會丟失!
▲ ISAM
ISAM表類型是MyISAM出現之前MySQL的默認表類型,所以現在這種表類型是不推薦使用的,建議改用MyISAM表。
▲ MERGE
MERGE是一種值得關注的新式表類型,在3.23.25版中提供。MERGE表實際上由一組同樣的MyISAM表合并而成。之所以要把多個同樣的表合并成一個,主要是出于性能上的考慮,因為它能夠提高搜索速度、提高修復效率、節省磁盤空間。
當前的MERGE表類型仍舊屬于BETA版本,但相信正式版本很快就會出現。
▲ MyISAM
MyISAM表類型是MySQL默認的表類型。MyISAM表類型以ISAM為基礎,但增加了許多有用的擴展。下面是部分用MyISAM表類型取代ISAM表類型的原因:
MyISAM表比ISAM表要小,因而占用資源更少。
MyISAM表在不同的平臺間二進制可移植。
MyISAM還有其他許多優點。請訪問
http://www.mysql.com/doc/I/S/ISAM.html查看關于該表類型的完整說明。
表的類型在創建表時指定。在下面這個例子中我們創建了一個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了解完整說明以及要使用BDB表應該做哪些準備。
MySQL 4.0將增加兩種新的表類型,即Innobase和Gemeni。關于這兩種表類型現在能夠得到的信息還不多。
關于MySQL表類型,有待學習的知識實在太多,本文簡短的介紹不可能做到完整和詳盡。建議訪問MySQL文檔(
http://www.mysql.com)了解更詳盡的信息。
正確的編譯方法固然重要,但它只是提高MySQL服務器性能工作的一部分。MySQL服務器的許多參數會影響服務器的性能表現,而且我們可以把這些參數保存到配置文件,使得每次MySQL服務器啟動時這些參數都自動發揮作用。這個配置文件就是my.cnf。
MySQL服務器提供了my.cnf文件的幾個示例,它們可以在/usr/local/mysql/share/mysql/目錄下找到,名字分別為my-small.cnf、my-medium.cnf、my-large.cnf以及my-huge.cnf。文件名字中關于規模的說明描述了該配置文件適用的系統類型。例如,如果運行MySQL服務器的系統內存不多,而且MySQL只是偶爾使用,那么使用my-small.cnf配置文件最為理想,這個配置文件告訴mysqld daemon使用最少的系統資源。反之,如果MySQL服務器用于支持一個大規模的在線商場,系統擁有2G的內存,那么使用mysql-huge.cnf最為合適。
要使用上述示例配置文件,我們應該先復制一個最適合要求的配置文件,并把它命名為my.cnf。這個復制得到的配置文件可以按照如下三種方式使用:
全局:把這個my.cnf文件復制到服務器的/etc目錄,此時文件中所定義的參數將全局有效,即對該服務器上運行的所有MySQL數據庫服務器都有效。
局部:把這個my.cnf文件復制到[MYSQL-INSTALL-DIR]/var/將使該文件只對指定的服務器有效,其中[MYSQL-INSTALL-DIR]表示安裝MySQL的目錄。
用戶:最后,我們還可以把該文件的作用范圍局限到指定的用戶,這只需把my.cnf文件復制到用戶的根目錄即可。
那么,如何設置my.cnf文件中的參數呢?或者進一步說,哪些參數是我們可以設置的呢?所有這些參數都對MySQL服務器有著全局性的影響,但同時每一個參數都和MySQL的特定部分關系較為密切。例如,max_connections參數屬于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]小節加上一個set-variable指令,具體請參見配置文件中的示例。
許多新手往往把重新編譯源代碼看成是一種無可避免的災禍,其實編譯源代碼還能對程序的最終性能起到顯著的影響。編譯過程可以用不同流水線上裝配同樣型號的汽車比擬:第一條流水線由素質較低的工人操作,裝配程序未能盡善盡美,零件裝配誤差較大;第二條流水線由高素質的技術工人操作,汽車裝配程序合理,且利用最好的工具保證產品的高質量。雖然兩條流水線上裝配出來的汽車外觀一模一樣,但兩種汽車的性能表現卻可能大不相同。對于編譯器來說情況也完全相似,有些編譯器裝配出來的程序要比其他編譯器的更好。
編譯時考慮所有可用的選項也是極其重要的。很可能某些編譯器的默認選項值不能符合要求,或者,為了滿足應用的特定需求,我們需要指定一些特殊的編譯選項。正如MySQL文檔所指出的,只要采用了更好的編譯器或者使用更合理的編譯選項,應用性能的提高程度可以達到10-30%。
既然如此,編譯時具體應該注意哪些問題才能讓MySQL數據庫運行得更快呢?
▲ 使用pgcc編譯器
如果系統使用的是奔騰處理器,那么pgcc(Pentium GCC)正是為這些系統下運行的程序提供的專用編譯器。pgcc是gcc編譯器(
http://www.gnu.org/software/gcc/)的奔騰優化版,用pgcc編譯MySQL代碼可以讓整體性能提高10%以上!關于pgcc的更多信息,請參見
http://www.goof.com/pcg/。當然,如果系統使用的不是奔騰處理器,采用這種方法提高MySQL的運行速度就不合適了,因為正如其名字所示,pgcc是專門為奔騰系統提供的。
▲ 把mysqld編譯成靜態模式
以不帶共享庫的形式編譯mysqld同樣可以提高性能。在配置行加入下面這個選項可以將mysqld編譯成靜態模式:
% >./configure -with-mysqld-ldflags=-all-static [--其他配置選項]
▲ 配置示例
下面的配置命令經常用于提高MySQL的性能:
% >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
詳細解釋每個gcc選項的作用已經超出了本文的范圍,請訪問gcc的說明文檔了解這些信息(
http://gcc.gnu.org/)。注意不要拘泥于這個例子,請在命令行執行man gcc仔細了解每一個gcc選項的含義。