Mysql InnoDB引擎的索引與存儲(chǔ)結(jié)構(gòu)詳解
在Oracle 和SQL Server等數(shù)據(jù)庫(kù)中只有一種存儲(chǔ)引擎,所有數(shù)據(jù)存儲(chǔ)管理機(jī)制都是一樣的。
而MySql數(shù)據(jù)庫(kù)提供了多種存儲(chǔ)引擎。用戶可以根據(jù)不同的需求為數(shù)據(jù)表選擇不同的存儲(chǔ)引擎,用戶也可以根據(jù)自己的需要編寫(xiě)自己的存儲(chǔ)引擎。
MySQL主要存儲(chǔ)引擎的區(qū)別
MySQL默認(rèn)的存儲(chǔ)引擎是MyISAM,其他常用的就是InnoDB,另外還有MERGE、MEMORY(HEAP)等。
主要的幾個(gè)存儲(chǔ)引擎
MyISAM管理非事務(wù)表,提供高速存儲(chǔ)和檢索,以及全文搜索能力。
MyISAM是Mysql的默認(rèn)存儲(chǔ)引擎。當(dāng)create創(chuàng)建新表時(shí),未指定新表的存儲(chǔ)引擎時(shí),默認(rèn)使用MyISAM。每個(gè)MyISAM在磁盤(pán)上存儲(chǔ)成三個(gè)文件。文件名都和表名相同,擴(kuò)展名分別是.frm(存儲(chǔ)表定義)、.MYD (MYData,存儲(chǔ)數(shù)據(jù))、.MYI (MYIndex,存儲(chǔ)索引)。數(shù)據(jù)文件和索引文件可以放置在不同的目錄,平均分布io,獲得更快的速度。
InnoDB存儲(chǔ)引擎用于事務(wù)處理應(yīng)用程序,具有眾多特性,包括ACID事務(wù)支持,提供了具有提交、回滾和崩潰恢復(fù)能力的事務(wù)安全。但是對(duì)比MyISAM存儲(chǔ)引擎,InnoDB寫(xiě)的處理效率差一些并且會(huì)占用更多的磁盤(pán)空間以保留數(shù)據(jù)和索引。
Memory將所有數(shù)據(jù)保存在內(nèi)存中,可以應(yīng)用于臨時(shí)表中在需要快速查找引用和其他類(lèi)似數(shù)據(jù)的環(huán)境下,可提供極快的訪問(wèn)。Memory使用哈希索引,所以數(shù)據(jù)的存取速度非常快。
Merge允許MySQL DBA或開(kāi)發(fā)人員將一系列等同的MyISAM表以邏輯方式組合在一起,并作為1個(gè)對(duì)象引用它們。對(duì)于諸如數(shù)據(jù)倉(cāng)儲(chǔ)等VLDB環(huán)境十分適合。
不同存儲(chǔ)引擎的橫向?qū)Ρ?/strong>
特點(diǎn) | MyISAM | BDB | Memory | InnoDB |
---|---|---|---|---|
存儲(chǔ)限制 | 沒(méi)有 | 沒(méi)有 | 有 | 64TB |
事務(wù)安全 | 支持 | 支持 | ||
鎖機(jī)制 | 表鎖 | 頁(yè)鎖 | 表鎖 | 行鎖 |
B樹(shù)索引 | 支持 | 支持 | 支持 | 支持 |
哈希索引 | 支持 | 支持 | ||
全文索引 | 支持 | |||
集群索引 | 支持 | |||
數(shù)據(jù)緩存 | 支持 | 支持 | ||
索引緩存 | 支持 | 支持 | 支持 | |
數(shù)據(jù)可壓縮 | 支持 | |||
空間使用 | 低 | 低 | N/A | 高 |
內(nèi)存使用 | 低 | 低 | 中等 | 高 |
批量插入的速度 | 高 | 高 | 高 | 低 |
支持外鍵 | 支持 |
查看和配置存儲(chǔ)引擎的操作
1.用show engines; 命令可以顯示當(dāng)前數(shù)據(jù)庫(kù)支持的存儲(chǔ)引擎情況;
2.要查看表的定義結(jié)構(gòu)等信息可以使用以下幾種命令:
Desc[ribe] tablename; //查看數(shù)據(jù)表的結(jié)構(gòu) Show create table tablename; //顯示表的創(chuàng)建語(yǔ)句,可以查看創(chuàng)建表時(shí)指定的ENGINE show table status like ‘tablename'\G顯示表的當(dāng)前狀態(tài)值
3.設(shè)置或修改表的存儲(chǔ)引擎
創(chuàng)建數(shù)據(jù)庫(kù)表時(shí)設(shè)置存儲(chǔ)存儲(chǔ)引擎的基本語(yǔ)法是:
Create table tableName( columnName(列名1) type(數(shù)據(jù)類(lèi)型) attri(屬性設(shè)置), columnName(列名2) type(數(shù)據(jù)類(lèi)型) attri(屬性設(shè)置), ……..) engine = engineName
修改存儲(chǔ)引擎,可以用命令
Alter table tableName engine =engineName
對(duì)于整個(gè)服務(wù)器或方案,你并不一定要使用相同的存儲(chǔ)引擎,可以為方案中的每個(gè)表使用不同的存儲(chǔ)引擎。
InnoDB的存儲(chǔ)結(jié)構(gòu)
InnoDB使用頁(yè)面存儲(chǔ)結(jié)構(gòu),下面是InnoDB的表空間結(jié)構(gòu)圖:
Page頁(yè)面存儲(chǔ)格式如下圖所示:
一個(gè)頁(yè)面的存儲(chǔ)由以下幾部分組成:
- 頁(yè)頭(Page Header):記錄頁(yè)面的控制信息,共占150字節(jié),包括頁(yè)的左右兄弟頁(yè)面指針、頁(yè)面空間使用情況等,頁(yè)頭的詳細(xì)說(shuō)明會(huì)在下一篇中描述。
- 最小虛記錄、最大虛記錄:兩個(gè)固定位置存儲(chǔ)的虛記錄,本身并不存儲(chǔ)數(shù)據(jù)。最小虛記錄比任何記錄都小,而最大虛記錄比任何記錄都大。
- 記錄堆(record heap):指上圖的橙黃色部分。表示頁(yè)面已分配的記錄空間,也是索引數(shù)據(jù)的真正存儲(chǔ)區(qū)域。記錄堆分為兩種,即有效記錄和已刪除記錄。有效記錄就是索引正常使用的記錄,而已刪除記錄表示索引已經(jīng)刪除,不在使用的記錄,如上圖的深藍(lán)色部分。隨著記錄的更新和刪除越來(lái)越頻繁,記錄堆中已刪除記錄將會(huì)越多,即會(huì)出現(xiàn)越來(lái)越多的空洞(碎片)。這些已刪除記錄連接起來(lái),就會(huì)成為頁(yè)面的自由空間鏈表。
- 未分配空間:指頁(yè)面未使用的存儲(chǔ)空間,隨著頁(yè)面不斷使用,未分配空間將會(huì)越來(lái)越小。當(dāng)新插入一條記錄時(shí),首先嘗試從自由空間鏈表中獲得合適的存儲(chǔ)位置(空間足夠),如果沒(méi)有滿足的,就會(huì)在未分配空間中申請(qǐng)。
- slot區(qū):slot是一些頁(yè)面有效記錄的指針,每個(gè)slot占兩個(gè)字節(jié),存儲(chǔ)了記錄相對(duì)頁(yè)面首地址的偏移。如果頁(yè)面有n條有效記錄,那么slot的數(shù)量就在n/8+2~n/4+2之間。下一節(jié)詳細(xì)介紹slot區(qū),它是記錄頁(yè)面有序和二分查找的關(guān)鍵。
- 頁(yè)尾(Page Tailer):頁(yè)面最后部分,占8個(gè)字節(jié),主要存儲(chǔ)頁(yè)面的校驗(yàn)信息。
頁(yè)面中的頁(yè)頭,最大/最小虛記錄以及頁(yè)尾都是頁(yè)面中有固定的存儲(chǔ)位置。
InnoDB的索引結(jié)構(gòu)
InnoDB使用B+Tree的方式存儲(chǔ)索引。
Innodb的一個(gè)表可能包含多個(gè)索引,每個(gè)索引都使用B+樹(shù)來(lái)存儲(chǔ)。而索引包括聚集索引和二級(jí)索引,聚集索引使用表的主鍵作為索引鍵,包含表的所有字段。二級(jí)索引只包含索引鍵和聚集索引鍵(主鍵)的內(nèi)容,不包括其他字段。每一個(gè)索引都是一棵B+樹(shù),每棵B+樹(shù)由很多頁(yè)面組成,而每個(gè)頁(yè)面大小一般為16K。從B+樹(shù)的組織結(jié)構(gòu)來(lái)看,B樹(shù)的頁(yè)面可分為:
葉子節(jié)點(diǎn):B樹(shù)層次為0的頁(yè)面,存儲(chǔ)記錄的所有內(nèi)容。
非葉子節(jié)點(diǎn):B樹(shù)層次大于0的頁(yè)面,只存儲(chǔ)索引鍵和頁(yè)面指針。
一棵典型的B+樹(shù)結(jié)構(gòu):
從上圖可知,相同層次的頁(yè)面是用一個(gè)雙向鏈表連接起來(lái)的。
一般情況下,從B+樹(shù)的最左邊葉子節(jié)點(diǎn)開(kāi)始,一直向右掃描,就可以得到B+樹(shù)的從小到大的所有數(shù)據(jù)。因此,對(duì)于葉子節(jié)點(diǎn),有如下特征:
頁(yè)內(nèi)數(shù)據(jù)是按索引鍵排序的。
頁(yè)面的任一記錄的索引鍵值不小于其左兄弟頁(yè)面的任何記錄。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)本站的支持。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。