佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > Mysql InnoDB引擎的索引與存儲結(jié)構(gòu)詳解

Mysql InnoDB引擎的索引與存儲結(jié)構(gòu)詳解

熱門標(biāo)簽:網(wǎng)站排名優(yōu)化 AI電銷 百度競價排名 鐵路電話系統(tǒng) 服務(wù)外包 呼叫中心市場需求 Linux服務(wù)器 地方門戶網(wǎng)站

前言

在Oracle 和SQL Server等數(shù)據(jù)庫中只有一種存儲引擎,所有數(shù)據(jù)存儲管理機(jī)制都是一樣的。

而MySql數(shù)據(jù)庫提供了多種存儲引擎。用戶可以根據(jù)不同的需求為數(shù)據(jù)表選擇不同的存儲引擎,用戶也可以根據(jù)自己的需要編寫自己的存儲引擎。

MySQL主要存儲引擎的區(qū)別

MySQL默認(rèn)的存儲引擎是MyISAM,其他常用的就是InnoDB,另外還有MERGE、MEMORY(HEAP)等。

主要的幾個存儲引擎

MyISAM管理非事務(wù)表,提供高速存儲和檢索,以及全文搜索能力。

MyISAM是Mysql的默認(rèn)存儲引擎。當(dāng)create創(chuàng)建新表時,未指定新表的存儲引擎時,默認(rèn)使用MyISAM。每個MyISAM在磁盤上存儲成三個文件。文件名都和表名相同,擴(kuò)展名分別是.frm(存儲表定義)、.MYD (MYData,存儲數(shù)據(jù))、.MYI (MYIndex,存儲索引)。數(shù)據(jù)文件和索引文件可以放置在不同的目錄,平均分布io,獲得更快的速度。

InnoDB存儲引擎用于事務(wù)處理應(yīng)用程序,具有眾多特性,包括ACID事務(wù)支持,提供了具有提交、回滾和崩潰恢復(fù)能力的事務(wù)安全。但是對比MyISAM存儲引擎,InnoDB寫的處理效率差一些并且會占用更多的磁盤空間以保留數(shù)據(jù)和索引。

Memory將所有數(shù)據(jù)保存在內(nèi)存中,可以應(yīng)用于臨時表中在需要快速查找引用和其他類似數(shù)據(jù)的環(huán)境下,可提供極快的訪問。Memory使用哈希索引,所以數(shù)據(jù)的存取速度非???。

Merge允許MySQL DBA或開發(fā)人員將一系列等同的MyISAM表以邏輯方式組合在一起,并作為1個對象引用它們。對于諸如數(shù)據(jù)倉儲等VLDB環(huán)境十分適合。

不同存儲引擎的橫向?qū)Ρ?/strong> 

特點(diǎn) MyISAM BDB Memory InnoDB
存儲限制 沒有 沒有 64TB
事務(wù)安全   支持   支持
鎖機(jī)制 表鎖 頁鎖 表鎖 行鎖
B樹索引 支持 支持 支持 支持
哈希索引     支持 支持
全文索引 支持      
集群索引       支持
數(shù)據(jù)緩存     支持 支持
索引緩存 支持   支持 支持
數(shù)據(jù)可壓縮 支持      
空間使用 N/A
內(nèi)存使用 中等
批量插入的速度
支持外鍵       支持

查看和配置存儲引擎的操作

1.用show engines; 命令可以顯示當(dāng)前數(shù)據(jù)庫支持的存儲引擎情況;

2.要查看表的定義結(jié)構(gòu)等信息可以使用以下幾種命令:

Desc[ribe] tablename; //查看數(shù)據(jù)表的結(jié)構(gòu)
Show create table tablename; //顯示表的創(chuàng)建語句,可以查看創(chuàng)建表時指定的ENGINE
show table status like ‘tablename'\G顯示表的當(dāng)前狀態(tài)值

3.設(shè)置或修改表的存儲引擎

創(chuàng)建數(shù)據(jù)庫表時設(shè)置存儲存儲引擎的基本語法是:

Create table tableName(
columnName(列名1) type(數(shù)據(jù)類型) attri(屬性設(shè)置),
columnName(列名2) type(數(shù)據(jù)類型) attri(屬性設(shè)置),
……..) engine = engineName

修改存儲引擎,可以用命令

Alter table tableName engine =engineName

對于整個服務(wù)器或方案,你并不一定要使用相同的存儲引擎,可以為方案中的每個表使用不同的存儲引擎。

InnoDB的存儲結(jié)構(gòu)

InnoDB使用頁面存儲結(jié)構(gòu),下面是InnoDB的表空間結(jié)構(gòu)圖:

Page頁面存儲格式如下圖所示:

一個頁面的存儲由以下幾部分組成:

  1. 頁頭(Page Header):記錄頁面的控制信息,共占150字節(jié),包括頁的左右兄弟頁面指針、頁面空間使用情況等,頁頭的詳細(xì)說明會在下一篇中描述。
  2. 最小虛記錄、最大虛記錄:兩個固定位置存儲的虛記錄,本身并不存儲數(shù)據(jù)。最小虛記錄比任何記錄都小,而最大虛記錄比任何記錄都大。
  3. 記錄堆(record heap):指上圖的橙黃色部分。表示頁面已分配的記錄空間,也是索引數(shù)據(jù)的真正存儲區(qū)域。記錄堆分為兩種,即有效記錄和已刪除記錄。有效記錄就是索引正常使用的記錄,而已刪除記錄表示索引已經(jīng)刪除,不在使用的記錄,如上圖的深藍(lán)色部分。隨著記錄的更新和刪除越來越頻繁,記錄堆中已刪除記錄將會越多,即會出現(xiàn)越來越多的空洞(碎片)。這些已刪除記錄連接起來,就會成為頁面的自由空間鏈表。
  4. 未分配空間:指頁面未使用的存儲空間,隨著頁面不斷使用,未分配空間將會越來越小。當(dāng)新插入一條記錄時,首先嘗試從自由空間鏈表中獲得合適的存儲位置(空間足夠),如果沒有滿足的,就會在未分配空間中申請。
  5. slot區(qū):slot是一些頁面有效記錄的指針,每個slot占兩個字節(jié),存儲了記錄相對頁面首地址的偏移。如果頁面有n條有效記錄,那么slot的數(shù)量就在n/8+2~n/4+2之間。下一節(jié)詳細(xì)介紹slot區(qū),它是記錄頁面有序和二分查找的關(guān)鍵。
  6. 頁尾(Page Tailer):頁面最后部分,占8個字節(jié),主要存儲頁面的校驗(yàn)信息。

頁面中的頁頭,最大/最小虛記錄以及頁尾都是頁面中有固定的存儲位置。

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

InnoDB使用B+Tree的方式存儲索引。

Innodb的一個表可能包含多個索引,每個索引都使用B+樹來存儲。而索引包括聚集索引和二級索引,聚集索引使用表的主鍵作為索引鍵,包含表的所有字段。二級索引只包含索引鍵和聚集索引鍵(主鍵)的內(nèi)容,不包括其他字段。每一個索引都是一棵B+樹,每棵B+樹由很多頁面組成,而每個頁面大小一般為16K。從B+樹的組織結(jié)構(gòu)來看,B樹的頁面可分為:

葉子節(jié)點(diǎn):B樹層次為0的頁面,存儲記錄的所有內(nèi)容。
非葉子節(jié)點(diǎn):B樹層次大于0的頁面,只存儲索引鍵和頁面指針。

一棵典型的B+樹結(jié)構(gòu):

從上圖可知,相同層次的頁面是用一個雙向鏈表連接起來的。

一般情況下,從B+樹的最左邊葉子節(jié)點(diǎn)開始,一直向右掃描,就可以得到B+樹的從小到大的所有數(shù)據(jù)。因此,對于葉子節(jié)點(diǎn),有如下特征:

頁內(nèi)數(shù)據(jù)是按索引鍵排序的。

頁面的任一記錄的索引鍵值不小于其左兄弟頁面的任何記錄。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • MySQL slow_log表無法修改成innodb引擎詳解
  • MySQL存儲引擎InnoDB的配置與使用的講解
  • MySQL存儲引擎MyISAM與InnoDB區(qū)別總結(jié)整理
  • MySQL InnoDB存儲引擎的深入探秘
  • 修改MySQL數(shù)據(jù)庫引擎為InnoDB的操作

標(biāo)簽:黃山 湖南 蘭州 仙桃 崇左 銅川 衡水 湘潭

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Mysql InnoDB引擎的索引與存儲結(jié)構(gòu)詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    洛南县| 自治县| 团风县| 台湾省| 临沧市| 遵义市| 富宁县| 岗巴县| 平果县| 莲花县| 天长市| 阿拉尔市| 吴忠市| 南城县| 积石山| 安西县| 金寨县| 沅江市| 土默特左旗| 延长县| 南涧| 阿拉善盟| 上高县| 邓州市| 西峡县| 南靖县| 定远县| 桦川县| 天镇县| 历史| 澄迈县| 乐业县| 崇左市| 延吉市| 拉孜县| 阳春市| 根河市| 织金县| 阿拉善左旗| 牡丹江市| 宣威市|