MySQL性能優(yōu)化

          Posted on 2007-11-09 10:55 yukui 閱讀(144) 評(píng)論(0)  編輯  收藏 所屬分類: 技術(shù)
                  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)的含義。

          posts - 131, comments - 12, trackbacks - 0, articles - 32

          Copyright © yukui

          主站蜘蛛池模板: 丰都县| 绥江县| 澜沧| 平安县| 竹北市| 遵义县| 观塘区| 木里| 尼勒克县| 阿拉善左旗| 乳山市| 崇州市| 长岛县| 循化| 新野县| 南乐县| 牙克石市| 剑川县| 岱山县| 台南市| 德州市| 图们市| 韩城市| 南康市| 石屏县| 镇沅| 依安县| 丰城市| 兴业县| 曲靖市| 二手房| 界首市| 临湘市| 金川县| 精河县| 六盘水市| 南充市| 丹巴县| 五莲县| 高密市| 襄垣县|