真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

前言

目前創(chuàng)新互聯(lián)已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、網(wǎng)站運(yùn)營、企業(yè)網(wǎng)站設(shè)計、安慶網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

在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)MyISAMBDBMemoryInnoDB
存儲限制沒有沒有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)圖:

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

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

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

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

  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é),主要存儲頁面的校驗信息。

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

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):

Mysql InnoDB引擎的索引與存儲結(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í)價值,如果有疑問大家可以留言交流,謝謝大家對創(chuàng)新互聯(lián)的支持。


當(dāng)前題目:MysqlInnoDB引擎的索引與存儲結(jié)構(gòu)詳解
網(wǎng)站地址:http://weahome.cn/article/ipshcg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部