數(shù)據(jù)庫引擎

Innodb引擎

Innodb引擎提供了對(duì)數(shù)據(jù)庫ACID事務(wù)的支持琳拨,并且實(shí)現(xiàn)了SQL標(biāo)準(zhǔn)的四種隔離級(jí)別月褥,關(guān)于數(shù)據(jù)庫事務(wù)與其隔離級(jí)別的內(nèi)容請(qǐng)見數(shù)據(jù)庫事務(wù)與其隔離級(jí)別這篇文章弛随。該引擎還提供了行級(jí)鎖和外鍵約束,它的設(shè)計(jì)目標(biāo)是處理大容量數(shù)據(jù)庫系統(tǒng)宁赤,它本身其實(shí)就是基于MySQL后臺(tái)的完整數(shù)據(jù)庫系統(tǒng)舀透,MySQL運(yùn)行時(shí)Innodb會(huì)在內(nèi)存中建立緩沖池,用于緩沖數(shù)據(jù)和索引决左。但是該引擎不支持FULLTEXT類型的索引愕够,而且它沒有保存表的行數(shù),當(dāng)SELECT COUNT(*) FROM TABLE時(shí)需要掃描全表佛猛。當(dāng)需要使用數(shù)據(jù)庫事務(wù)時(shí)惑芭,該引擎當(dāng)然是首選。由于鎖的粒度更小继找,寫操作不會(huì)鎖定全表遂跟,所以在并發(fā)較高時(shí),使用Innodb引擎會(huì)提升效率婴渡。但是使用行級(jí)鎖也不是絕對(duì)的幻锁,如果在執(zhí)行一個(gè)SQL語句時(shí)MySQL不能確定要掃描的范圍,InnoDB表同樣會(huì)鎖全表边臼。

MyIASM引擎

MyIASM是MySQL默認(rèn)的引擎哄尔,但是它沒有提供對(duì)數(shù)據(jù)庫事務(wù)的支持,也不支持行級(jí)鎖和外鍵硼瓣,因此當(dāng)INSERT(插入)或UPDATE(更新)數(shù)據(jù)時(shí)即寫操作需要鎖定整個(gè)表究飞,效率便會(huì)低一些。不過和Innodb不同堂鲤,MyIASM中存儲(chǔ)了表的行數(shù)亿傅,于是SELECT COUNT(*) FROM TABLE時(shí)只需要直接讀取已經(jīng)保存好的值而不需要進(jìn)行全表掃描。如果表的讀操作遠(yuǎn)遠(yuǎn)多于寫操作且不需要數(shù)據(jù)庫事務(wù)的支持瘟栖,那么MyIASM也是很好的選擇葵擎。

兩種引擎的選擇

大尺寸的數(shù)據(jù)集趨向于選擇InnoDB引擎,因?yàn)樗С质聞?wù)處理和故障恢復(fù)半哟。數(shù)據(jù)庫的大小決定了故障恢復(fù)的時(shí)間長短酬滤,InnoDB可以利用事務(wù)日志進(jìn)行數(shù)據(jù)恢復(fù)签餐,這會(huì)比較快。主鍵查詢?cè)贗nnoDB引擎下也會(huì)相當(dāng)快盯串,不過需要注意的是如果主鍵太長也會(huì)導(dǎo)致性能問題氯檐,關(guān)于這個(gè)問題我會(huì)在下文中講到。大批的INSERT語句(在每個(gè)INSERT語句中寫入多行体捏,批量插入)在MyISAM下會(huì)快一些冠摄,但是UPDATE語句在InnoDB下則會(huì)更快一些,尤其是在并發(fā)量大的時(shí)候几缭。

Index——索引

索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)河泳。MyIASM和Innodb都使用了樹這種數(shù)據(jù)結(jié)構(gòu)做為索引,關(guān)于樹我也曾經(jīng)寫過一篇文章樹是一種偉大的數(shù)據(jù)結(jié)構(gòu)年栓,只是自己的理解拆挥,有興趣的朋友可以去閱讀。下面我接著講這兩種引擎使用的索引結(jié)構(gòu)某抓,講到這里纸兔,首先應(yīng)該談一下B-Tree和B+Tree。

B-Tree和B+Tree

B+Tree是B-Tree的變種搪缨,那么我就先講B-Tree吧食拜,相信大家都知道紅黑樹,這是我前段時(shí)間學(xué)《算法》一書時(shí)副编,實(shí)現(xiàn)的一顆紅黑樹,大家可以參考流强。其實(shí)紅黑樹類似2,3-查找樹痹届,這種樹既有2叉結(jié)點(diǎn)又有3叉結(jié)點(diǎn)。B-Tree也與之類似打月,它的每個(gè)結(jié)點(diǎn)做多可以有d個(gè)分支(叉)队腐,d稱為B-Tree的度,如下圖所示奏篙,它的每個(gè)結(jié)點(diǎn)可以有4個(gè)元素柴淘,5個(gè)分支,于是它的度為5秘通。B-Tree中的元素是有序的为严,比如圖中元素7左邊的指針指向的結(jié)點(diǎn)中的元素都小于7,而元素7和16之間的指針指向的結(jié)點(diǎn)中的元素都處于7和16之間肺稀,正是滿足這樣的關(guān)系第股,才能高效的查找:首先從根節(jié)點(diǎn)進(jìn)行二分查找,找到就返回對(duì)應(yīng)的值话原,否則就進(jìn)入相應(yīng)的區(qū)間結(jié)點(diǎn)遞歸的查找夕吻,直到找到對(duì)應(yīng)的元素或找到null指針诲锹,找到null指針則表示查找失敗。這個(gè)查找是十分高效的涉馅,其時(shí)間復(fù)雜度為O(logN)(以d為底归园,當(dāng)d很大時(shí),樹的高度就很低)稚矿,因?yàn)槊看螜z索最多只需要檢索樹高h(yuǎn)個(gè)結(jié)點(diǎn)庸诱。

MyISAM引擎的索引結(jié)構(gòu)

MyISAM引擎的索引結(jié)構(gòu)為B+Tree,其中B+Tree的數(shù)據(jù)域存儲(chǔ)的內(nèi)容為實(shí)際數(shù)據(jù)的地址盐捷,也就是說它的索引和實(shí)際的數(shù)據(jù)是分開的偶翅,只不過是用索引指向了實(shí)際的數(shù)據(jù),這種索引就是所謂的非聚集索引碉渡。

Innodb引擎的索引結(jié)構(gòu)

Innodb引擎的索引結(jié)構(gòu)同樣也是B+Tree聚谁,但是Innodb的索引文件本身就是數(shù)據(jù)文件,即B+Tree的數(shù)據(jù)域存儲(chǔ)的就是實(shí)際的數(shù)據(jù)滞诺,這種索引就是聚集索引形导。這個(gè)索引的key就是數(shù)據(jù)表的主鍵,因此InnoDB表數(shù)據(jù)文件本身就是主索引习霹。

因?yàn)镮nnoDB的數(shù)據(jù)文件本身要按主鍵聚集朵耕,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定淋叶,則MySQL系統(tǒng)會(huì)自動(dòng)選擇一個(gè)可以唯一標(biāo)識(shí)數(shù)據(jù)記錄的列作為主鍵阎曹,如果不存在這種列,則MySQL自動(dòng)為InnoDB表生成一個(gè)隱含字段作為主鍵煞檩,這個(gè)字段長度為6個(gè)字節(jié)处嫌,類型為長整形。

并且和MyISAM不同斟湃,InnoDB的輔助索引數(shù)據(jù)域存儲(chǔ)的也是相應(yīng)記錄主鍵的值而不是地址熏迹,所以當(dāng)以輔助索引查找時(shí),會(huì)先根據(jù)輔助索引找到主鍵凝赛,再根據(jù)主鍵索引找到實(shí)際的數(shù)據(jù)注暗。所以Innodb不建議使用過長的主鍵,否則會(huì)使輔助索引變得過大墓猎。建議使用自增的字段作為主鍵捆昏,這樣B+Tree的每一個(gè)結(jié)點(diǎn)都會(huì)被順序的填滿,而不會(huì)頻繁的分裂調(diào)整陶衅,會(huì)有效的提升插入數(shù)據(jù)的效率屡立。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子膨俐,更是在濱河造成了極大的恐慌勇皇,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焚刺,死亡現(xiàn)場(chǎng)離奇詭異敛摘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)乳愉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門兄淫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蔓姚,你說我怎么就攤上這事捕虽。” “怎么了坡脐?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵泄私,是天一觀的道長。 經(jīng)常有香客問我备闲,道長晌端,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任恬砂,我火速辦了婚禮咧纠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泻骤。我一直安慰自己漆羔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布狱掂。 她就那樣靜靜地躺著钧椰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪符欠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天瓶埋,我揣著相機(jī)與錄音希柿,去河邊找鬼。 笑死养筒,一個(gè)胖子當(dāng)著我的面吹牛曾撤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晕粪,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼挤悉,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了巫湘?” 一聲冷哼從身側(cè)響起装悲,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤昏鹃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后诀诊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洞渤,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年属瓣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了载迄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抡蛙,死狀恐怖护昧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粗截,我是刑警寧澤惋耙,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站慈格,受9級(jí)特大地震影響怠晴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浴捆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一蒜田、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧选泻,春花似錦冲粤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至窝撵,卻和暖如春傀顾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碌奉。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工短曾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赐劣。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓嫉拐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親魁兼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子婉徘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容