數(shù)據(jù)庫(kù)引擎介紹 MySQL數(shù)據(jù)庫(kù)引擎取決于MySQL在安裝的時(shí)候是如何被編譯的,。要添加一個(gè)新的引擎,,就必須重新編譯MYSQL。在缺省情況下,,MYSQL支持 三個(gè)引擎:ISAM,、MYISAM和HEAP。另外兩種類(lèi)型INNODB和BERKLEY(BDB),,也常??梢允褂谩H绻夹g(shù)高超,,還可以使用 MySQL+API自己做一個(gè)引擎,。下面介紹幾種數(shù)據(jù)庫(kù)引擎: ISAM:ISAM是一個(gè)定義明確且歷經(jīng)時(shí)間考驗(yàn)的數(shù)據(jù)表格管理方法,它在設(shè)計(jì)之時(shí)就考慮到 數(shù)據(jù)庫(kù)被查詢(xún)的次數(shù)要遠(yuǎn)大于更新的次數(shù)。因此,,ISAM執(zhí)行讀取操作的速度很快,,而且不占用大量的內(nèi)存和存儲(chǔ)資源。ISAM的兩個(gè)主要不足之處在于,,它不 支持事務(wù)處理,,也不能夠容錯(cuò):如果你的硬盤(pán)崩潰了,那么數(shù)據(jù)文件就無(wú)法恢復(fù)了,。如果你正在把ISAM用在關(guān)鍵任務(wù)應(yīng)用程序里,,那就必須經(jīng)常備份你所有的實(shí) 時(shí)數(shù)據(jù),通過(guò)其復(fù)制特性,,MYSQL能夠支持這樣的備份應(yīng)用程序,。MyISAM:MyISAM是MySQL的ISAM擴(kuò)展格式和缺省的數(shù)據(jù)庫(kù)引擎。除了提供ISAM里所沒(méi)有的索引和字段管理的大量功能,,MyISAM還使用一種表格鎖定的機(jī)制,來(lái)優(yōu)化多個(gè)并發(fā)的讀寫(xiě)操作,,其代價(jià)是你需要經(jīng)常運(yùn)行OPTIMIZE TABLE命令,,來(lái)恢復(fù)被更新機(jī)制所浪費(fèi)的空間。MyISAM還有一些有用的擴(kuò)展,,例如用來(lái)修復(fù)數(shù)據(jù)庫(kù)文件的MyISAMCHK工具和用來(lái)恢復(fù)浪費(fèi)空間的 MyISAMPACK工具,。MYISAM強(qiáng)調(diào)了快速讀取操作,這可能就是為什么MySQL受到了WEB開(kāi)發(fā)如此青睞的主要原因:在WEB開(kāi)發(fā)中你所進(jìn)行的大量數(shù)據(jù)操作都是讀取操作,。所以,,大多數(shù)虛擬主機(jī)提供商和INTERNET平臺(tái)提供商只允許使用MYISAM格式。MyISAM格式的一個(gè)重要缺陷就是不能在表?yè)p壞后恢復(fù)數(shù)據(jù),。 HEAP:HEAP允許只駐留在內(nèi)存里的臨時(shí)表格,。駐留在內(nèi)存里讓HEAP要比ISAM和MYISAM都快,但是它所管理的數(shù)據(jù)是不穩(wěn)定的,,而且如果在關(guān)機(jī)之前沒(méi)有進(jìn)行保存,,那么所有的數(shù)據(jù)都會(huì)丟失。在數(shù)據(jù)行被刪除的時(shí)候,,HEAP也不會(huì)浪費(fèi)大量的空間,。HEAP表格在你需要使用SELECT表達(dá)式來(lái)選擇和操控?cái)?shù)據(jù)的時(shí)候非常有用。要記住,,在用完表格之后就刪除表格,。 InnoDB:InnoDB數(shù)據(jù)庫(kù)引擎都是造就MySQL靈活性的技術(shù)的直接產(chǎn)品,這項(xiàng)技術(shù)就是MYSQL+API,。在 使用MYSQL的時(shí)候,,你所面對(duì)的每一個(gè)挑戰(zhàn)幾乎都源于ISAM和MyISAM數(shù)據(jù)庫(kù)引擎不支持事務(wù)處理(transaction process)也不支持外來(lái)鍵。盡管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了對(duì)事務(wù)處理和外來(lái)鍵的支持,,這兩點(diǎn)都是前兩個(gè)引擎所沒(méi)有的,。如前所述,如果你的設(shè)計(jì)需要這些特性中的一者 或者兩者,,那你就要被迫使用后兩個(gè)引擎中的一個(gè)了,。 如果感覺(jué)自己的確技術(shù)高超,你還能夠使用MySQL+API來(lái)創(chuàng)建自己的數(shù)據(jù)庫(kù)引擎,。這個(gè)API為你提供了操作字段,、記錄、表格,、數(shù)據(jù)庫(kù),、連接、安全賬號(hào) 的功能,,以及建立諸如MySQL這樣DBMS所需要的所有其他無(wú)數(shù)功能,。深入講解API已經(jīng)超出了本文的范圍,但是你需要了解MySQL+API的存在及 其可交換引擎背后的技術(shù),,這一點(diǎn)是很重要的,。估計(jì)這個(gè)插件式數(shù)據(jù)庫(kù)引擎的模型甚至能夠被用來(lái)為MySQL創(chuàng)建本地的XML提供器(XML provider)。(任何讀到本文的MySQL+API開(kāi)發(fā)人員可以把這一點(diǎn)當(dāng)作是個(gè)要求,。) MyISAM與InnoDB的區(qū)別 InnoDB和MyISAM是許多人在使用MySQL時(shí)最常用的兩個(gè)表類(lèi)型,,這兩個(gè)表類(lèi)型各有優(yōu)劣,視具體應(yīng)用而定,?;镜牟顒e為:MyISAM類(lèi)型不 支持事務(wù)處理等高級(jí)處理,而InnoDB類(lèi)型支持,。MyISAM類(lèi)型的表強(qiáng)調(diào)的是性能,,其執(zhí)行數(shù)度比InnoDB類(lèi)型更快,但是不提供事務(wù)支持,,而 InnoDB提供事務(wù)支持已經(jīng)外部鍵等高級(jí)數(shù)據(jù)庫(kù)功能,。 以下是一些細(xì)節(jié)和具體實(shí)現(xiàn)的差別: 另外,,InnoDB表的行鎖也不是絕對(duì)的,,假如在執(zhí)行一個(gè)SQL語(yǔ)句時(shí)MySQL不能確定要掃描的范圍,InnoDB表同樣會(huì)鎖全表,,例如updatetable set num=1 where name like “a%” 原因如下: 一般來(lái)說(shuō),,MyISAM適合: InnoDB適合: 以下為引用的內(nèi)容: 復(fù)制代碼 代碼如下: CREATE TABLE tblMyISAM ( id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (id), value_a TINYINT ) TYPE=MyISAM CREATE TABLE tblISAM ( id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (id), value_a TINYINT ) TYPE=ISAM CREATE TABLE tblHeap ( id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (id), value_a TINYINT ) TYPE=Heap 你也可以使用ALTER TABLE命令,,把原有的表格從一個(gè)引擎移動(dòng)到另一個(gè)引擎。下面的代碼顯示了如何使用ALTER TABLE把MyISAM表格移動(dòng)到InnoDB的引擎: 以下為引用的內(nèi)容: 復(fù)制代碼 代碼如下: ALTER TABLE tblMyISAM CHANGE TYPE=InnoDB MySQL用三步來(lái)實(shí)現(xiàn)這一目的,。首先,這個(gè)表格的一個(gè)副本被創(chuàng)建,。然后,,任何輸入數(shù)據(jù)的改變都被排入隊(duì)列,同時(shí)這個(gè)副本被移動(dòng)到另一個(gè)引擎,。最后,,任何排入隊(duì)列的數(shù)據(jù)改變都被送交到新的表格里,,而原來(lái)的表格被刪除。 復(fù)制代碼 代碼如下: ALTER TABLE捷徑 如果只是想把表格從ISAM更新為MyISAM,,你可以使用MySQL_convert_table_format命令,,而不需要編寫(xiě)ALTER TABLE表達(dá)式。 你可以使用SHOW TABLE命令(這是MySQL對(duì)ANSI標(biāo)準(zhǔn)的另一個(gè)擴(kuò)展)來(lái)確定哪個(gè)引擎在管理著特定的表格,。SHOW
TABLE會(huì)返回一個(gè)帶有多數(shù)據(jù)列的結(jié)果集,,你可以用這個(gè)結(jié)果集來(lái)查詢(xún)獲得所有類(lèi)型的信息:數(shù)據(jù)庫(kù)引擎的名稱(chēng)在Type字段里。下面的示例代碼說(shuō)明了
SHOW TABLE的用法: 復(fù)制代碼 代碼如下: SHOW TABLE STATUS FROM tblInnoDB 你可以用SHOW CREATE TABLE [TableName]來(lái)取回SHOW TABLE能夠取回的信息,。 一般情況下,MySQL會(huì)默認(rèn)提供多種存儲(chǔ)引擎,,可以通過(guò)下面的查看: (1)看你的MySQL現(xiàn)在已提供什么存儲(chǔ)引擎: mysql> show engines,; (2)看你的MySQL當(dāng)前默認(rèn)的存儲(chǔ)引擎: mysql> show variables like '%storage_engine%'; (3)你要看某個(gè)表用了什么引擎(在顯示結(jié)果里參數(shù)engine后面的就表示該表當(dāng)前用的存儲(chǔ)引擎): mysql> show create table 表名,; 最 后,如果你想使用沒(méi)有被編譯成MySQL也沒(méi)有被激活的引擎,,那是沒(méi)有用的,MySQL不會(huì)提示這一點(diǎn),。而它只會(huì)給你提供一個(gè)缺省格式(MyISAM)的 表格。除了使用缺省的表格格式外,,還有辦法讓MySQL給出錯(cuò)誤提示,但是就現(xiàn)在而言,,如果不能肯定特定的數(shù)據(jù)庫(kù)引擎是否可用的話,,你要使用SHOW TABLE來(lái)檢查表格格式,。 更多的選擇意味著更好的性能 用于特定表格的引擎都需要重新編譯和追蹤,,考慮到這種的額外復(fù)雜性,為什么你還是想要使用非缺省的數(shù)據(jù)庫(kù)引擎呢,?答案很簡(jiǎn)單:要調(diào)整數(shù)據(jù)庫(kù)來(lái)滿足你的要求,。 可 以肯定的是,MyISAM的確快,,但是如果你的邏輯設(shè)計(jì)需要事務(wù)處理,,你就可以自由使用支持事務(wù)處理的引擎。進(jìn)一步講,,由于MySQL能夠允許你在表格這 一層應(yīng)用數(shù)據(jù)庫(kù)引擎,,所以你可以只對(duì)需要事務(wù)處理的表格來(lái)進(jìn)行性能優(yōu)化,而把不需要事務(wù)處理的表格交給更加輕便的MyISAM引擎,。對(duì)于 MySQL而言,,靈活性才是關(guān)鍵。 性能測(cè)試 在我們測(cè)試的這個(gè)38w的表中,表占用空間的情況如下: 引擎類(lèi)型MyISAM InnoDB 占用總空間 67,564 KB 80,048 KB 另外一個(gè)176W萬(wàn)記錄的表,, 表占用空間的情況如下: 占用總空間 123,269 KB179,584 KB |
|
來(lái)自: shiguoyiLove > 《技術(shù)》