表引擎
什么是MySql數(shù)據(jù)庫
??? 通常意義上,數(shù)據(jù)庫也就是數(shù)據(jù)的集合,具體到計(jì)算機(jī)上數(shù)據(jù)庫可以是存儲器上一些文件的集合或者一些內(nèi)存數(shù)據(jù)的集合。
??? 我們通常說的MySql數(shù)據(jù)庫,sql server數(shù)據(jù)庫等等其實(shí)是數(shù)據(jù)庫管理系統(tǒng),它們可以存儲數(shù)據(jù),并提供查詢和更新數(shù)據(jù)庫中的數(shù)據(jù)的功能等等。根據(jù)數(shù)據(jù)庫如何存儲數(shù)據(jù)和如何操作數(shù)據(jù)的實(shí)現(xiàn)機(jī)制不同,這些數(shù)據(jù)庫之間即有區(qū)別又有共同點(diǎn)。
??? MySql數(shù)據(jù)庫是開放源代碼的關(guān)系型數(shù)據(jù)庫。目前,它可以提供的功能有:支持sql語言、子查詢、存儲過程、觸發(fā)器、視圖、索引、事務(wù)、鎖、外鍵約束和影像復(fù)制等。在后期,我們會(huì)詳細(xì)講解這些功能。
??? 同Oracle 和SQL Server等大型數(shù)據(jù)庫系統(tǒng)一樣,MySql也是客戶/服務(wù)器系統(tǒng)并且是單進(jìn)程多線程架構(gòu)的數(shù)據(jù)庫。
??? MySql區(qū)別于其它數(shù)據(jù)庫系統(tǒng)的一個(gè)重要特點(diǎn)是支持插入式存儲引擎。
那么什么是存儲引擎呢?
??? 存儲引擎說白了就是如何存儲數(shù)據(jù)、如何為存儲的數(shù)據(jù)建立索引和如何更新、查詢數(shù)據(jù)等技術(shù)的實(shí)現(xiàn)方法。因?yàn)樵陉P(guān)系數(shù)據(jù)庫中數(shù)據(jù)的存儲是以表的形式存儲的,所以存儲引擎也可以稱為表類型(即存儲和操作此表的類型)。
??? 在Oracle 和SQL Server等數(shù)據(jù)庫中只有一種存儲引擎,所有數(shù)據(jù)存儲管理機(jī)制都是一樣的。而MySql數(shù)據(jù)庫提供了多種存儲引擎。用戶可以根據(jù)不同的需求為數(shù)據(jù)表選擇不同的存儲引擎,用戶也可以根據(jù)自己的需要編寫自己的存儲引擎。MySql中有哪些存儲引擎?
???? 1?MyISAM:這種引擎是mysql最早提供的。這種引擎又可以分為靜態(tài)MyISAM、動(dòng)態(tài)MyISAM 和壓縮MyISAM三種:
??? 靜態(tài)MyISAM:如果數(shù)據(jù)表中的各數(shù)據(jù)列的長度都是預(yù)先固定好的,服務(wù)器將自動(dòng)選擇這種表類型。因?yàn)閿?shù)據(jù)表中每一條記錄所占用的空間都是一樣的,所以這種表存取和更新的效率非常高。當(dāng)數(shù)據(jù)受損時(shí),恢復(fù)工作也比較容易做。
??? 動(dòng)態(tài)MyISAM:如果數(shù)據(jù)表中出現(xiàn)varchar、xxxtext或xxxBLOB字段時(shí),服務(wù)器將自動(dòng)選擇這種表類型。相對于靜態(tài)MyISAM,這種表存儲空間比較小,但由于每條記錄的長度不一,所以多次修改數(shù)據(jù)后,數(shù)據(jù)表中的數(shù)據(jù)就可能離散的存儲在內(nèi)存中,進(jìn)而導(dǎo)致執(zhí)行效率下降。同時(shí),內(nèi)存中也可能會(huì)出現(xiàn)很多碎片。因此,這種類型的表要經(jīng)常用optimize table 命令或優(yōu)化工具來進(jìn)行碎片整理。
??? 壓縮MyISAM:以上說到的兩種類型的表都可以用myisamchk工具壓縮。這種類型的表進(jìn)一步減小了占用的存儲,但是這種表壓縮之后不能再被修改。另外,因?yàn)槭菈嚎s數(shù)據(jù),所以這種表在讀取的時(shí)候要先時(shí)行解壓縮。
??? 但是,不管是何種MyISAM表,目前它都不支持事務(wù),行級鎖和外鍵約束的功能。
??? 2 MyISAM Merge引擎:這種類型是MyISAM類型的一種變種。合并表是將幾個(gè)相同的MyISAM表合并為一個(gè)虛表。常應(yīng)用于日志和數(shù)據(jù)倉庫。
????3 InnoDB:InnoDB表類型可以看作是對MyISAM的進(jìn)一步更新產(chǎn)品,它提供了事務(wù)、行級鎖機(jī)制和外鍵約束的功能。
????4 memory(heap):這種類型的數(shù)據(jù)表只存在于內(nèi)存中。它使用散列索引,所以數(shù)據(jù)的存取速度非???。因?yàn)槭谴嬖谟趦?nèi)存中,所以這種類型常應(yīng)用于臨時(shí)表中。
????5 archive:這種類型只支持select 和 insert語句,而且不支持索引。常應(yīng)用于日志記錄和聚合分析方面。
????當(dāng)然MySql支持的表類型不止上面幾種。
我們介紹幾種常用的引擎和了解幾個(gè)不常用的引擎。避免未來在實(shí)際工作中看到一些引擎不知道概念。
? ?
最常使用的2種存儲引擎:
·???????? Myisam是Mysql的默認(rèn)存儲引擎。當(dāng)create創(chuàng)建新表時(shí),未指定新表的存儲引擎時(shí),默認(rèn)使用Myisam。每個(gè)MyISAM在磁盤上存儲成三個(gè)文件。文件名都和表名相同,擴(kuò)展名分別是.frm(存儲表定義)、.MYD (MYData,存儲數(shù)據(jù))、.MYI (MYIndex,存儲索引)。數(shù)據(jù)文件和索引文件可以放置在不同的目錄,平均分布io,獲得更快的速度。???
·???????? InnoDB存儲引擎提供了具有提交、回滾和崩潰恢復(fù)能力的事務(wù)安全。但是對比Myisam的存儲引擎,InnoDB寫的處理效率差一些并且會(huì)占用更多的磁盤空間以保留數(shù)據(jù)和索引。
如何選擇合適的存儲引擎
選擇標(biāo)準(zhǔn):根據(jù)應(yīng)用特點(diǎn)選擇合適的存儲引擎,對于復(fù)雜的應(yīng)用系統(tǒng)可以根據(jù)實(shí)際情況選擇多種存儲引擎進(jìn)行組合。
下面是常用存儲引擎的適用環(huán)境:
1.???? MyISAM:默認(rèn)的MySQL插件式存儲引擎,它是在Web、數(shù)據(jù)倉儲和其他應(yīng)用環(huán)境下最常使用的存儲引擎之一
2.???? InnoDB:用于事務(wù)處理應(yīng)用程序,具有眾多特性,包括ACID事務(wù)支持。
3.???? Memory:將所有數(shù)據(jù)保存在RAM中,在需要快速查找引用和其他類似數(shù)據(jù)的環(huán)境下,可提供極快的訪問。
4.???? Merge:允許MySQL DBA或開發(fā)人員將一系列等同的MyISAM表以邏輯方式組合在一起,并作為1個(gè)對象引用它們。對于諸如數(shù)據(jù)倉儲等VLDB環(huán)境十分適合。
MyISAM
不支持事務(wù),表鎖(表級鎖,加鎖會(huì)鎖住整個(gè)表),支持全文索引,操作速度快。常用于讀取多的業(yè)務(wù)。
1.??? myisam存儲引擎表由myd和myi組成。.myd用來存放數(shù)據(jù)文件,.myi用來存放索引文件。
2.??? 對于myisam存儲引擎表,mysql數(shù)據(jù)庫只緩存其索引文件,數(shù)據(jù)文件的緩存由操作系統(tǒng)本身來完成。
InnoDB
1.??? 支持事務(wù),主要面向在線事務(wù)處理(OLTP)方面的應(yīng)用。
2.??? 行鎖設(shè)計(jì),支持外鍵,即默認(rèn)情況下讀取操作不加鎖。
InnoDB是為處理巨大數(shù)據(jù)量時(shí)的最大性能設(shè)計(jì)。
注:
行鎖:寫入、更新操作的時(shí)候?qū)⑦@一行鎖起來,不讓其他人再操作了。
表鎖:寫入、更新操作時(shí),將表給鎖起來不讓其他人再操作了。
事務(wù):同時(shí)操作多個(gè)數(shù)據(jù),若其中的一個(gè)數(shù)據(jù)操作失敗??苫貪L到操作之前。常用于銀行、電商、金融等系統(tǒng)中。
?