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