数据库引擎讲解_1
1. 各個(gè)存儲(chǔ)引擎,來看看MYSQL的各個(gè)存儲(chǔ)引擎,當(dāng)然這么多的存儲(chǔ)引擎,我們重點(diǎn)講兩個(gè)吧,其實(shí)這些我下面都有介紹,但是重點(diǎn)我要講哪個(gè)呢,重點(diǎn)講MYISAM,和InnoDB,因?yàn)檫@兩個(gè)存儲(chǔ)引擎它是比較有代表性意義的,我們來看MYSQL的存儲(chǔ)引擎其實(shí)我們?cè)谥vMYSQL的歷史的時(shí)候,我們提到了一個(gè),MYSQL最早這個(gè)東西是為了是為了做存儲(chǔ)倉庫,所以其實(shí)它更多的是對(duì)查詢上面做了優(yōu)化,而沒有對(duì)事物做控制,所以最早的版本MYSQL里面的存儲(chǔ)引擎只有一個(gè)叫ISAM,那么這個(gè)ISAM呢,有的同學(xué)會(huì)認(rèn)為是IS’AM,不是這個(gè)意思,它是四個(gè)單詞的簡(jiǎn)寫,哪四個(gè)單詞呢,其實(shí)這個(gè)四個(gè)單詞恰恰就定義到了數(shù)據(jù)庫的一個(gè)特點(diǎn),I指的是誰能不能猜出來,I是indexed索引,S是誰呢,S是Sequential序列,然后A是誰呢,A是Access,M是誰呢,M是Method,注意直譯過來就是索引序列訪問法,通過這個(gè)名字我么就可以定義到,其實(shí)這個(gè)引擎更多的是為了解決什么問題,優(yōu)化查詢,ISAM是一個(gè)定義明確且歷經(jīng)時(shí)間考驗(yàn)的數(shù)據(jù)表格管理方法,他在設(shè)計(jì)的時(shí)候就考慮到數(shù)據(jù)庫被查詢的次數(shù)就要遠(yuǎn)大于更新的次數(shù),因此,ISAM執(zhí)行讀操作的速度很快,而且不占用大量的內(nèi)存和存儲(chǔ)資源,ISAM有兩個(gè)主要的不足之處,在于他不支持事務(wù)處理,這有一個(gè)歷史遺留問題,也就是說在8幾年那個(gè)年代,其實(shí)數(shù)據(jù)庫還沒有提出事務(wù)ACID的特點(diǎn),什么原子性,一致性,隔離性,持久性,所以他更多的是考慮做數(shù)據(jù)存儲(chǔ),更多的是為查詢做準(zhǔn)備,還沒有考慮到事務(wù),那這里我們一定要記住,是不是索引序列訪問法,是不是不支持事務(wù),記住它是不支持事務(wù)的,第二個(gè)是什么呢,第二個(gè)缺點(diǎn)是不能夠容錯(cuò),如果你的硬盤崩潰掉了,那么數(shù)據(jù)文件就無法恢復(fù)了,這是一個(gè)非常致命的問題,如果你把ISAM用在關(guān)鍵任務(wù)應(yīng)用程序里,那就需要經(jīng)常備份你經(jīng)常使用的數(shù)據(jù),通過其復(fù)制特點(diǎn),MYSQL能夠支持這樣的備份應(yīng)用數(shù)據(jù),MYSQL是可以實(shí)時(shí)備份的,你不備份,一旦蹦了,數(shù)據(jù)就丟了,那其實(shí)即便是實(shí)時(shí)備份,你想想他是不是也有可能會(huì)丟,那么在這里我們需要注意的一點(diǎn)是,使用ISAM注意,必須經(jīng)常備份所有的實(shí)時(shí)數(shù)據(jù),那我是不是得經(jīng)常備份啊,因?yàn)檫@個(gè)動(dòng)作真要去做,而且像這個(gè)ISAM這個(gè),現(xiàn)在已經(jīng)沒有人去用了如果非得用它,也是用它的升級(jí)版MyISAM,這是最早的MSYQL版本提供的,除了有這兩個(gè)缺點(diǎn)以外,他有一個(gè)優(yōu)點(diǎn),對(duì)索引支持的特別好,而且MYSQL的索引是做的非常不錯(cuò)的,比如說用這個(gè)B-TREE,Balanced-Tree,還有叫什么全文注解,這些都是可以提升它的查詢效率的,而恰恰這種索引技術(shù),能很好的被ISAM所處理,所以他的查詢性能是比較高的
2. 我們?cè)賮砜吹诙€(gè)存儲(chǔ)引擎,叫MyISAM,其實(shí)MyISAM是什么意思呢,這個(gè)我已經(jīng)有介紹了,MyISAM是對(duì)MYSQL的ISAM的一個(gè)擴(kuò)展和缺省數(shù)據(jù)庫引擎,注意看這個(gè)關(guān)鍵詞,缺省,那么說也就是默認(rèn)的了,不是的,但是它是在MYSQL5.5之前作為一個(gè)默認(rèn)的引擎,但是從MYSQL5.5以后,他的存儲(chǔ)引擎默認(rèn)的就已經(jīng)不再是MyISAM,是InnoDB,回顧一下,我們?cè)贚inux下,第一次啟動(dòng)MYSQL的時(shí)候,那說明我們當(dāng)前所用的MYSQL的版本至少是5.5以上的,那我們接著往下看,除了提供ISAM里鎖沒有的索引和字段管理的大量功能,MyISAM還使用一種表格鎖定的機(jī)制,因?yàn)樵诙嗑€程下數(shù)據(jù)是共享的,我們既要對(duì)他做到安全,我們查詢效率會(huì)用到事務(wù)這個(gè)概念,什么共享鎖,獨(dú)占鎖,排他鎖,等等,其實(shí)這里我有必要和大家多說依據(jù),MYSQL也好,ORALCE也好,提升查詢的效率對(duì)于鎖,他們已經(jīng)細(xì)化到極細(xì)極細(xì)的單位,舉個(gè)例子,現(xiàn)在有這么多客戶端,都來我這個(gè)DB,而且是并發(fā)的,那么我這個(gè)DB給你提供數(shù)據(jù)的時(shí)候,他并沒有在這個(gè)位置做鎖控制,不是來了做成串型化,如果是那樣的話,你想一想,他最終和串型化還是一個(gè)樣,一個(gè)一個(gè)去處理,所以他并沒有在這個(gè)概念去做鎖的處理,而是在哪兒呢,還要往后推,他這個(gè)軸越是往后推,并發(fā)的延展性就越強(qiáng),效率損耗就越低,如果上來就串行化了那后面延伸的就直接串行化了,所以他會(huì)把并發(fā)的時(shí)間軸往后延,延到哪兒呢,延到不能夠再延了,操作數(shù)據(jù)了,如果這塊我再不去做處理,那數(shù)據(jù)就會(huì)有風(fēng)險(xiǎn)了,就已經(jīng)去讀數(shù)據(jù)了,他會(huì)在哪做鎖呢,在你操作數(shù)據(jù)時(shí),那它是把所有的都變成串行化嗎,不管你是查詢還是更新還是刪除,還是添加,不是,他還得看你對(duì)數(shù)據(jù)做了什么樣的操作,在這個(gè)操作上再去做鎖的處理,如果再往后推,他必須在最后的節(jié)點(diǎn)上做鎖的控制,所以說當(dāng)你去做一個(gè)查詢的時(shí)候,它會(huì)給你上一個(gè)共享鎖,共享鎖什么意思,誰都可以查,這個(gè)數(shù)據(jù)不鎖定,共享鎖就是不鎖定,但是一旦這個(gè)數(shù)據(jù)要去做DML操作了,它會(huì)給他上一個(gè)排他鎖,排他鎖不是一上來就鎖定了,比如咱們的更新鎖吧,更新是建立在一次查詢之后才去更新的,所以說像這個(gè)更新鎖,是兩個(gè)鎖的復(fù)合鎖,是共享鎖和排他鎖,在更新的時(shí)候,我有個(gè)數(shù)據(jù)A,我要去更新他,在更的時(shí)候我去查的時(shí)候,還需要上排他鎖呢,還是共享鎖呢,恰巧這個(gè)時(shí)候有人查數(shù)據(jù),但是一旦我把數(shù)據(jù)查出來了,這個(gè)時(shí)候我就不能讓別人再查了,因?yàn)橄乱徊轿荫R上要更新了,我再不鎖定他,就可以出現(xiàn)張冠李戴的現(xiàn)象了,所以在這個(gè)節(jié)點(diǎn)上,馬上把共享鎖變成排他鎖,還有獨(dú)占鎖,這個(gè)時(shí)候所有的查詢,什么時(shí)候釋放這個(gè)鎖呢,等他的數(shù)據(jù)更新完畢以后,他在釋放掉這個(gè)排他鎖,是在不得不做的這個(gè)環(huán)節(jié)了,才去做鎖的處理,所以說這些策略都是為了提高他的數(shù)據(jù)庫的一個(gè)性能,有沒有說明白,來優(yōu)化多個(gè)讀寫操作,其代價(jià)就是你需要經(jīng)常運(yùn)行OPTIMIZE TABLE命令,OPTIMIZE是什么東西呢,它是一個(gè)命令,這個(gè)命令其實(shí)為了解決什么問題呢,比如我們對(duì)表做DML操作的時(shí)候,更新也好,刪除也好,比如我們拿刪除來說,它支持表的刪除的,更新的,你頻繁的對(duì)一個(gè)表的數(shù)據(jù)做刪除,那么這個(gè)時(shí)候,對(duì)于數(shù)據(jù)庫來講,他把這個(gè)數(shù)據(jù)從數(shù)據(jù)文件移除以后,這個(gè)時(shí)候其實(shí)會(huì)在數(shù)據(jù)文件里面產(chǎn)生大量的碎片,這個(gè)碎片其實(shí)歸根結(jié)底不是來自于文件,而是來源于磁盤,文件其實(shí)也是磁盤的一種邏輯表現(xiàn)形式,我們存所有的文件不就是存磁盤嗎,磁盤那么大怎么存,文件可以規(guī)劃這個(gè)存儲(chǔ)結(jié)構(gòu)和內(nèi)容,所以這個(gè)東西最終還是要砸到磁盤,那么我們對(duì)磁盤做操作就涉及到一個(gè)碎片的問題,這個(gè)碎片如果在這里不好做理解,我們換一個(gè)角度來理解,比如我們現(xiàn)在裝操作系統(tǒng),因?yàn)槟銈兛赡軟]就接觸到,磁盤在存二進(jìn)制的時(shí)候,這一個(gè)字節(jié)到底怎么存,這是有規(guī)則的,那么這個(gè)規(guī)則就是我們所說的磁盤存儲(chǔ)規(guī)則,如果你沒聽過就是現(xiàn)在太智能化了把一些底層的東西給掩蓋了,比如我們現(xiàn)在安裝操作系統(tǒng),分區(qū)恢復(fù)就可以了,比如在我那個(gè)年代,我們要想裝系統(tǒng),就得經(jīng)歷過這幾個(gè)步驟,第一個(gè)分區(qū),分區(qū)是什么呢,把一個(gè)物理磁盤,劃分為邏輯的幾個(gè)區(qū)域,我們現(xiàn)在的D盤,F盤....,這個(gè)并不是把真正的物理硬盤給切割了,而是邏輯的劃分了,你的文件不能存在除了這幾個(gè)盤以外的地方了,只能存到這里了,然后在這個(gè)區(qū)域里又分為目錄,又分為文件,所以我們分完區(qū)以后,這個(gè)時(shí)候磁盤是沒法存文件的,所以我們得給他一個(gè)存儲(chǔ)格式,怎么辦呢要對(duì)它做格式化處理,最早在裝windows98,windows2000之前的,比如你電腦用著突然死機(jī)了,這時(shí)候你再開機(jī),在啟動(dòng)的時(shí)候他不會(huì)馬上進(jìn)入操作系統(tǒng),它會(huì)做一個(gè)碎片清理,我突然掉電了,有一些程序在內(nèi)存里面運(yùn)行的時(shí)候,有一些文件運(yùn)行的不完整,那么久可能導(dǎo)致在磁盤里又丟失的情況,磁盤之前是連續(xù)的來存儲(chǔ),現(xiàn)在不是連續(xù)的了,不連續(xù)鎖帶來的問題是什么,加入原來有8個(gè)空
window98都支持碎片整理的一個(gè)能力,把這些浪費(fèi)掉的回收回來,然后把它們做一個(gè)排序,這就叫碎片整理,其實(shí)我說這個(gè)東西是想通的,如果能用MyISAM存數(shù)據(jù)的時(shí)候,產(chǎn)生碎片,產(chǎn)生碎片就會(huì)帶來磁盤浪費(fèi),要使用OPTIMIZE TABLE命令對(duì)你的這個(gè)表去做碎片整理,把數(shù)據(jù)文件倒騰出來,然后更合理的存儲(chǔ)數(shù)據(jù),所以這命令主要是干這事的,所以這也是MyISAM的一個(gè)缺點(diǎn),如果你的引擎是他,數(shù)據(jù)有刪除了或者有其他的更新操作它會(huì)產(chǎn)生碎片,需要我們用這樣的命令做一個(gè)釋放,而且這個(gè)命令要注意,這個(gè)命令很簡(jiǎn)單,OPTIMIZE TABLE 表名,就可以了,但是一旦你對(duì)這個(gè)表做碎片整理了,這個(gè)表是鎖定狀態(tài)的,什么意思,這個(gè)表什么都干不了,什么時(shí)候等他碎片整理完了,所以會(huì)有這樣的一個(gè)問題,用這個(gè)命令來恢復(fù)被更新機(jī)制所浪費(fèi)的空間,MyISAM還有一些有用的擴(kuò)展,例如來修復(fù)數(shù)據(jù)庫文件的MyISAMCHK工具,MYISAM強(qiáng)調(diào)了快速讀寫操作,這是為什么MYSQL受到WEB開發(fā)如此青睞的原因,這我再多說一句,其實(shí)大家開始懷疑,MYSQL一個(gè)開源的東西,而且還這么小,注意小和大是相對(duì)的,相對(duì)于ORACLE,ORACLE一個(gè)安裝文件就一個(gè)多G,而MYSQL100M,這玩意能靠譜嗎,其實(shí)很多人都對(duì)這個(gè)有疑問,互聯(lián)網(wǎng)公司最大的一個(gè)特點(diǎn)是什么,數(shù)據(jù)量大,那這小玩意能行嗎,我記得一個(gè)本書里面寫著,MYSQL麻雀雖小五臟俱全,他的性能或者他的可靠性,已經(jīng)不再是業(yè)內(nèi)所懷疑的一個(gè)對(duì)象了,為什么對(duì)他不懷疑了呢,好多現(xiàn)在比較主流的互聯(lián)網(wǎng)公司存儲(chǔ)都在用MYSQL,比如國(guó)內(nèi)的淘寶京東,包括騰訊,他們大量的應(yīng)用用MYSQL,原來淘寶用ORACLE,不用了,全部用MYSQL,除了國(guó)內(nèi)往國(guó)外說,FACEBOOK,FACEBOOK那么大的信息量,說明MYSQL的可靠性還是比較強(qiáng)的,你想想這種產(chǎn)品,你說他小,他能力強(qiáng),你說這樣的產(chǎn)品能不被用戶所接受嗎,所以說現(xiàn)在好多人也在用MYSQL,但是MYSQL能不能徹底的替代ORACLE呢,還是不能的,單從服務(wù)這一塊,因?yàn)镸YSQL是開源的,他沒有服務(wù),出了問題你自己搗鼓,不像ORACLE,我花錢買的產(chǎn)品,我這邊數(shù)據(jù)有問題了,售后馬上給你來處理,明白我的意思吧,ORACLE有專門的人給你解決,這是一個(gè)選擇的問題,所以他最終沒有誰替代誰的問題,各有各的優(yōu)缺點(diǎn),ORACLE一般用于企業(yè)級(jí)開發(fā),他們兩個(gè)互相補(bǔ),使用MYISAM引擎的時(shí)候要注意,必須經(jīng)常使用OPTIMIZE TABLE命令清理表空間,必須經(jīng)常備份所有的數(shù)據(jù),這個(gè)肯定需要經(jīng)常備份的,這是MYISAM遺留的問題,但是這里需要注意一個(gè),字段類型,約束,記住三個(gè)文件,如果使用該引擎,會(huì)生成三個(gè)文件,.frm的,這里存的是表結(jié)構(gòu)信息,.MYD這個(gè)存的是數(shù)據(jù)文件,.MYI這個(gè)存的是表的索引信息,如果你在你的數(shù)據(jù)庫里發(fā)現(xiàn)這三個(gè)文件,其實(shí)更關(guān)鍵的是.MYD和.MYI這兩個(gè),那說明你當(dāng)前這個(gè)表的引擎存的是MYISAM引擎的,因?yàn)镮nnoDB所生成的數(shù)據(jù)文件名字是不一樣的,那這個(gè)引擎有沒有講清楚,所以歸根結(jié)底總結(jié)一下,這個(gè)引擎最大的特點(diǎn)是什么,就是優(yōu)化查詢,就是查詢效率比較高,那么久上升到了一個(gè)優(yōu)化的問題,咱們?cè)跀?shù)據(jù)庫優(yōu)化的時(shí)候該怎么去優(yōu)化,我們會(huì)有一個(gè)策略,除了SQL優(yōu)化,建索引,但是一旦建立索引了,他所影響的面,它會(huì)對(duì)你這個(gè)列在執(zhí)行DML操作的時(shí)候性能比沒有建索引的性能要低的多,再往后優(yōu)化,是不是可以把查詢多,事務(wù)沒有那么嚴(yán)的是不是可以換成MYISAM,怎么換一會(huì)教你,但是你別忘了,建索引影響的是一個(gè)列,而引擎影響的是一個(gè)表,再往后對(duì)數(shù)據(jù)庫的內(nèi)存分布做優(yōu)化,那影響的是整個(gè)數(shù)據(jù)庫,優(yōu)化的過程是逐步的向后擴(kuò),那么你影響的面就越廣,所以我們?cè)趦?yōu)化的過程當(dāng)中,對(duì)于換引擎這個(gè)東西,慎重慎重,為什么這么說,因?yàn)閾Q引擎簡(jiǎn)單,但是不是每個(gè)表都適合去換引擎,首先設(shè)計(jì)表的時(shí)候就要考慮哪些作為存儲(chǔ)表,哪些作為查詢表,那么大家對(duì)這個(gè)引擎有沒有了解了,他的最大特點(diǎn)就是查詢效率高
3. 先看看什么叫InnoDB,InnoDB數(shù)據(jù)庫引擎都是造就MYSQL靈活性的技術(shù)的直接產(chǎn)品,這項(xiàng)技術(shù)就是MYSQL++的API,在使用MYSQL的時(shí)候,你所面對(duì)的每一個(gè)挑戰(zhàn)幾乎都源自于ISAM和MyISAM數(shù)據(jù)庫引擎不支持事務(wù)處理,其實(shí)數(shù)據(jù)庫不支持事務(wù)及其可怕,比如我們?cè)谧鲭娚痰臅r(shí)候,所以現(xiàn)在對(duì)于事務(wù)的要求性,就是數(shù)據(jù)庫必須要支持事務(wù),就是MYSQL5.5之前就默認(rèn)不支持事務(wù),這是他的一個(gè)缺陷,那么其實(shí)InnoDB其實(shí)就是為了解決這個(gè)問題的,ISAM和MYISAM不支持事務(wù)以外,還不支持外鍵,盡管要比ISAM和MYISAM要慢很多,說明這個(gè)引擎在查詢性能上是不是比前兩個(gè)引擎要慢,是的,肯定是要比前兩個(gè)引擎要慢的,但是InnoDB包括了對(duì)事務(wù)處理和外鍵的支持,其實(shí)正是因?yàn)樗鼘?duì)事務(wù)的支持,才會(huì)導(dǎo)致他的查詢效率會(huì)有影響,這兩點(diǎn)都是這兩個(gè)引擎所沒有的,如前所述,如果你的設(shè)計(jì)需要這些特性中的一者或者兩者,那你就需要被迫使用兩個(gè)引擎中的一個(gè)了,那你想一想,我們對(duì)于數(shù)據(jù)庫的操作,所以InnoDB是我們用的最多的一個(gè)引擎,MYSQL官方對(duì)InnoDB是這樣解釋的,InnoDB給MYSQL提供了具有提交,回滾和崩潰恢復(fù)能力的事務(wù)安全(ACID)存儲(chǔ)引擎,什么意思呢,MYSQL說了,我的事務(wù)是按照嚴(yán)格標(biāo)準(zhǔn)來執(zhí)行的,作為事務(wù)的四個(gè)特性ACID,隔離性,原子性,一致性,持久性,我全都支持,然后InnoDB鎖定在行級(jí),并且在SELECT語句中提供一個(gè)ORACLE風(fēng)格一致的非鎖定讀,剛才我說過,非鎖定就是共享鎖,就是讀的不是每個(gè)人一個(gè)一個(gè)讀,而是一起讀,這些特色增加了多用戶部署和性能,沒有在InnoDB中擴(kuò)大鎖需要,因?yàn)樵贗nnoDB中行級(jí)鎖定適合非常小的空間,他有行級(jí)鎖定,還有表級(jí)鎖定,InnoDB也支持FOREIGN KEY的強(qiáng)制,也就是這東西還支持外鍵查詢,那外鍵的參照完整性也就支持了,沒錯(cuò)啊,在SQL查詢中,你可以自由的講InnoDB類型的表與其它MYSQL的表的類型混合起來,甚至可以在同一個(gè)查詢中也可以混合,InnoDB是為處理巨大數(shù)據(jù)量時(shí)的最大性能設(shè)計(jì),他的CPU效率可能是任何其它基于磁盤的關(guān)系數(shù)據(jù)庫引擎所不能匹敵的,就是他的性能更強(qiáng)大一些,InnoDB存儲(chǔ)引擎完全與MYSQL整合,InnoDB存儲(chǔ)它的表,索引在一個(gè)表空間中,表空間可以包含數(shù)個(gè)文件,InnoDB存儲(chǔ)引擎在主內(nèi)存中緩存數(shù)據(jù)和索引而維持它的自己的緩存池,這與MYISAM不同,比如MYISAM表中每個(gè)表被存在分離的文件中,InnoDB可以是任何尺寸,即使在文件尺寸被限制為2GB的操作系統(tǒng)上也沒問題,InnDB跟MYISAM的區(qū)別
InnoDB的特點(diǎn):1. 支持事務(wù)安裝2. 數(shù)據(jù)多版本讀取3. 鎖定機(jī)制的改進(jìn)4. 實(shí)現(xiàn)外鍵好記吧,就把這四點(diǎn)說一下,下面會(huì)有更詳細(xì)的東西了
InnoDB與MYISAM的區(qū)別?1. InnoDB支持事務(wù),他不支持,對(duì)于InnoDB每一條SQL語句都默認(rèn)封裝成事務(wù),之所以他的查詢效率會(huì)慢一些,是和事務(wù)有關(guān),因?yàn)樗鼤?huì)把每一條SQL都封裝成事務(wù),即便查詢也是,明白我的意思吧,自動(dòng)提交,這樣會(huì)影響速度,所以最好把多條SQL語言放在begin和commit之間,組成一個(gè)事務(wù),我們有沒有這么做,有的,我們?cè)谧臅r(shí)候,比如JDBC寫的時(shí)候,先不自動(dòng)提交嗎,然后把所有的SQL語句全都發(fā)給MYSQL之后,然后我們?cè)賑ommit2. InnoDB支持外鍵,而它不支持,對(duì)一個(gè)包含外鍵的InnoDB表轉(zhuǎn)為MYISAM會(huì)失敗,這個(gè)非常重要3. InnoDB是聚集索引,數(shù)據(jù)文件和索引綁定在一起,必須要有主鍵,其實(shí)就是我們?cè)诮ǖ臅r(shí)候,在建表的時(shí)候,你不建主鍵也能用,那有人說是不是和這句話就產(chǎn)生悖論了,這里不是說了嗎,不是必須要有主鍵嗎,其實(shí)是這樣的,當(dāng)你用InnoDB的時(shí)候,即便你不建主鍵,InnoDB也會(huì)去看你表里面有沒有唯一性的字段,如果有就會(huì)把它默認(rèn)設(shè)為主鍵,如果連這個(gè)也沒有,即便你不建主鍵,也會(huì)有一個(gè)默認(rèn)主鍵,但實(shí)際上我們?cè)诮ū淼臅r(shí)候,一般我們會(huì)自己來建一個(gè)索引,為什么要給表默認(rèn)建一個(gè)主鍵,為什么要保證表默認(rèn)有一個(gè)主鍵呢,這個(gè)就跟聚集索引有關(guān)了,就把所有表里關(guān)于InnoDB引擎的所有的主鍵,都做一個(gè)排列組合,以便你在檢索表的時(shí)候,某個(gè)表里數(shù)據(jù)的時(shí)候,能夠更快速的檢索數(shù)據(jù),聚集索引不是我們能見的,聚集索引是MYSQL的InnoDB自己來維護(hù)的,比如這是一個(gè)表,我們說一個(gè)表肯定會(huì)有一個(gè)主鍵嗎,既然這個(gè)表會(huì)有默認(rèn)的,聚合不就是聚到一起嗎,檢索的時(shí)候就會(huì)更快的檢索到,InnoDB在做數(shù)據(jù)檢索的時(shí)候,但是你說你沒有建主鍵,都是為了提高他的效率,但是輔助索引需要查詢兩次,輔助索引是什么啊,就是我們自己能夠創(chuàng)建的索引,比如說我們create index,比如我們查詢的列給他建了index,他首先會(huì)走聚集索引,然后才會(huì)走你自己建的索引,那有人說效率反而低了,不會(huì)的,因?yàn)樗饕旧砭湍軌蚨x到唯一性了,查兩次的效率也是非常高的,他不會(huì)在大量的數(shù)據(jù)中去檢索索引的,所以他不會(huì)影響到效率,這樣我先畫一個(gè)表結(jié)構(gòu),這里有一個(gè)id,有一個(gè)name,id是pk,pk就是主鍵,name是unique,明白我的意思了吧,然后當(dāng)你去查詢條件給的是name,那么這個(gè)時(shí)候我們?cè)诓樵兊臅r(shí)候,他先去他的聚集索引查,他的聚集索引有沒有和name索引有關(guān)的,聚集索引下有沒有,沒有,因?yàn)橹挥心愀鶕?jù)id查的時(shí)候才會(huì)去從聚集索引里查找,但是聚集索引是不是要查一次,沒查到,接著才會(huì)去走輔助索引也就是unique索引,我這么說能不能懂,所以他要查兩次嗎,首先查到主鍵,然后查詢主鍵所查詢到的數(shù)據(jù),因此主鍵不應(yīng)過大,因?yàn)橹麈I太大,其他索引也都會(huì)很大,而MYISAM是非聚集索引,注意MYISAM不支持聚集索引,聚集索引只有InnoDB,明白這個(gè)意思吧,記住聚集索引是InnoDB的特點(diǎn),數(shù)據(jù)文件是分離的,索引保存的是數(shù)據(jù)文件的指針,主鍵索引和輔助索引是獨(dú)立的4. InnoDB不保存表的具體行數(shù),也就是說不管你的表里又多少條數(shù)據(jù),都不保留他具體的行數(shù),所以我們想去計(jì)算有多少條數(shù)據(jù),是不是需要select count(*) 啊,其實(shí)這個(gè)count(*)是非常耗時(shí)的,因?yàn)椴僮餍枰頀呙?而MYISAM用了一個(gè)變量保存了整個(gè)表的行,也就是你可以通過這個(gè)引擎的一個(gè)偽列,就可以返回類似count(*)所返回的值,這是他的另一個(gè)缺點(diǎn),執(zhí)行上述語句時(shí)只需要讀出改變量即可,速度很快5. InnoDB不支持全文檢索,而MYISAM支持全文檢索,查詢效率上比MYISAM要高
對(duì)于這兩大引擎我們?cè)撊绾芜x擇呢?1. 還是我說過,其實(shí)對(duì)于我們開發(fā)人員來講,你用什么引擎跟我們的關(guān)系不大,我只要把數(shù)據(jù)持久化進(jìn)去就行了,更多的是DBA在優(yōu)化數(shù)據(jù)庫的時(shí)候需要考慮的,那怎么去選擇呢,第一我們要看是否要支持事務(wù),如果要支持那InnoDB是首選了,如果不需要刻意考慮MYISAM2.如果表中絕大部分?jǐn)?shù)據(jù)是查詢,可以考慮MYISAM,如果既有讀和寫,而且也比較頻繁,請(qǐng)考慮InnoDB3. 系統(tǒng)奔潰后,MYISAM恢復(fù)起來會(huì)更加困難,能否接受,就是這個(gè)數(shù)據(jù)庫一旦崩了,數(shù)據(jù)丟了,恢復(fù)起來老困難了,甚至恢復(fù)不了了,這事你能不能接受4. MYSQL5.5版本以后InnoDB已經(jīng)稱為MYSQL的默認(rèn)引擎,之前是MYISAM,說明其優(yōu)勢(shì)是有目共睹的,如果你不知道用什么那就用InnoDB,不會(huì)錯(cuò)的,其實(shí)還是那句話,這個(gè)引擎不會(huì)做修改,要想改,我先要考慮了,就是這個(gè)表未來就是做數(shù)據(jù)查詢的,如果你現(xiàn)在在設(shè)計(jì)數(shù)據(jù)庫的時(shí)候,沒有在考慮這么些問題,每個(gè)表只能DML操作,這也映射出一句話,我們?cè)陂_發(fā)的過程當(dāng)中,項(xiàng)目需求的階段,DBA是要介入的,包括你數(shù)據(jù)庫的設(shè)計(jì),DBA是要參與的,需要給出合理的數(shù)據(jù)庫設(shè)計(jì),合理的設(shè)計(jì)是針對(duì)于日后的優(yōu)化所提供的一個(gè)方式,前提是你們公司得有一個(gè)DBA,就是后來你是基于前端,服務(wù)端,然后運(yùn)維我花大量的時(shí)間去講存儲(chǔ)引擎的區(qū)別,大家有沒有理解了,我覺得講完你總結(jié)總結(jié),再遇到問這個(gè)問題,你們回答起來應(yīng)該是沒有壓力的,當(dāng)然你并不需要把它完全的背下來,其實(shí)一點(diǎn)都不那么復(fù)雜,那么剩下的就是數(shù)據(jù)庫提供的其他的引擎了,其他的引擎我們一帶而過,比如有一個(gè)NDBCluster,你看這個(gè)名就知道是什么意思了,說明這個(gè)引擎是支持MYSQL集群的,是從MYSQL5.0開始提供的,還有一個(gè)叫MERGE存儲(chǔ)引擎,MERGE存儲(chǔ)引擎也沒有什么了不起的,他就是把MYISAM的一些分離化的東西整合了,提供了一個(gè)統(tǒng)一的操作接口,操作入口吧,MERGE不就是合并的意思嗎,還有一個(gè)MEMORGY存儲(chǔ)引擎,看這個(gè)名字也就知道,他就是內(nèi)存引擎,存在內(nèi)存當(dāng)中的,你想一下存在內(nèi)存當(dāng)中是不是有一定的風(fēng)險(xiǎn)啊,介紹一個(gè)BLACKHOLE,什么意思,黑洞,你看這個(gè)引擎可有意思了,功能恰如其名,黑洞,就像我們unix系統(tǒng)下面的/dev/null一樣,不管我們寫什么信息,都是有去無回,就是往里塞,什么都不管,雖然他提供了這么多引擎,但是并不是每個(gè)引擎都適合我們,明白我的意思吧,跟我們用的最多的也是最廣的,那就是InnoDB了,包括我們的MYISAM,還有CSV存儲(chǔ)引擎,這個(gè)還是有用的,它是操作一個(gè)CSV文件,他不支持索引,就是大家有時(shí)候需要從數(shù)據(jù)庫導(dǎo)出一些報(bào)表文件,如果你的數(shù)據(jù)庫經(jīng)常導(dǎo)出報(bào)表,其他的沒什么了,你要是覺得這么引擎還不夠用,MYSQL更牛,MYSQL給你提供了一個(gè)接口,讓你可以自定義存儲(chǔ)引擎,MYSQL++是MYSQL的一門語言,架構(gòu)圖是不是有這么多引擎,你看后面有一個(gè)User Designed
?
總結(jié)
- 上一篇: 操作数据库存储引擎
- 下一篇: Oracle之SQL分析函数