欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2019年01月25日 10:02:07   作者:邴越  
這篇文章主要給大家介紹了Mysql InnoDB引擎的索引與存儲(chǔ)結(jié)構(gòu)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

在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ù)的存取速度非??臁?/p>

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ǔ)由以下幾部分組成:

  1. 頁(yè)頭(Page Header):記錄頁(yè)面的控制信息,共占150字節(jié),包括頁(yè)的左右兄弟頁(yè)面指針、頁(yè)面空間使用情況等,頁(yè)頭的詳細(xì)說(shuō)明會(huì)在下一篇中描述。
  2. 最小虛記錄、最大虛記錄:兩個(gè)固定位置存儲(chǔ)的虛記錄,本身并不存儲(chǔ)數(shù)據(jù)。最小虛記錄比任何記錄都小,而最大虛記錄比任何記錄都大。
  3. 記錄堆(record heap):指上圖的橙黃色部分。表示頁(yè)面已分配的記錄空間,也是索引數(shù)據(jù)的真正存儲(chǔ)區(qū)域。記錄堆分為兩種,即有效記錄和已刪除記錄。有效記錄就是索引正常使用的記錄,而已刪除記錄表示索引已經(jīng)刪除,不在使用的記錄,如上圖的深藍(lán)色部分。隨著記錄的更新和刪除越來(lái)越頻繁,記錄堆中已刪除記錄將會(huì)越多,即會(huì)出現(xiàn)越來(lái)越多的空洞(碎片)。這些已刪除記錄連接起來(lái),就會(huì)成為頁(yè)面的自由空間鏈表。
  4. 未分配空間:指頁(yè)面未使用的存儲(chǔ)空間,隨著頁(yè)面不斷使用,未分配空間將會(huì)越來(lái)越小。當(dāng)新插入一條記錄時(shí),首先嘗試從自由空間鏈表中獲得合適的存儲(chǔ)位置(空間足夠),如果沒(méi)有滿足的,就會(huì)在未分配空間中申請(qǐng)。
  5. 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)鍵。
  6. 頁(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ì)腳本之家的支持。

相關(guān)文章

  • 詳解MySQL數(shù)據(jù)備份之mysqldump使用方法

    詳解MySQL數(shù)據(jù)備份之mysqldump使用方法

    本篇文章主要介紹了MySQL數(shù)據(jù)備份,詳細(xì)的介紹了mysqldump的各種用法,具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-11-11
  • mac 裝5.6版本mysql 設(shè)置密碼的簡(jiǎn)易方法

    mac 裝5.6版本mysql 設(shè)置密碼的簡(jiǎn)易方法

    這篇文章主要介紹了mac 裝5.6版本mysql 設(shè)置密碼的簡(jiǎn)易方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-05-05
  • MySQL的InnoDB擴(kuò)容及ibdata1文件瘦身方案完全解析

    MySQL的InnoDB擴(kuò)容及ibdata1文件瘦身方案完全解析

    在使用InnoDB存儲(chǔ)引擎后,MySQL的ibdata1文件常常會(huì)占據(jù)大量存儲(chǔ)空間,這里我們就為大家?guī)?lái)MySQL的InnoDB擴(kuò)容及ibdata1文件瘦身方案完全解析:
    2016-06-06
  • 五分鐘讓你快速弄懂MySQL索引下推

    五分鐘讓你快速弄懂MySQL索引下推

    ICP(Index Condition Pushdown)是在MySQL 5.6版本上推出的查詢優(yōu)化策略,把本來(lái)由Server層做的索引條件檢查下推給存儲(chǔ)引擎層來(lái)做,下面這篇文章主要給大家介紹了關(guān)于MySQL索引下推的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • SQL中EXPLAIN命令的使用方法

    SQL中EXPLAIN命令的使用方法

    這篇文章主要給大家介紹了關(guān)于SQL中EXPLAIN命令的使用方法,文中介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 2017最新版windows安裝mysql教程

    2017最新版windows安裝mysql教程

    這篇文章主要介紹了2017最新版windows安裝mysql教程,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2017-08-08
  • mysql LOAD語(yǔ)句批量錄入數(shù)據(jù)

    mysql LOAD語(yǔ)句批量錄入數(shù)據(jù)

    本章的前面討論如何使用SQL向一個(gè)表中插入數(shù)據(jù)。但是,如果你需要向一個(gè)表中添加許多條記錄,使用SQL語(yǔ)句輸入數(shù)據(jù)是很不方便的。
    2010-03-03
  • mysql最左前綴法則導(dǎo)致索引失效的解決

    mysql最左前綴法則導(dǎo)致索引失效的解決

    最左前綴是在使用innodb存儲(chǔ)引擎索引時(shí),需要遵守的法則,本文主要介紹了mysql最左前綴法則導(dǎo)致索引失效的解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • Linux中使用mysqladmin extended-status配合Linux命令查看MySQL運(yùn)行狀態(tài)

    Linux中使用mysqladmin extended-status配合Linux命令查看MySQL運(yùn)行狀態(tài)

    這篇文章主要介紹了Linux中使用mysqladmin extended-status配合Linux命令查看MySQL運(yùn)行狀態(tài),需要的朋友可以參考下
    2014-08-08
  • 詳解在Windows環(huán)境下訪問(wèn)linux虛擬機(jī)中MySQL數(shù)據(jù)庫(kù)

    詳解在Windows環(huán)境下訪問(wèn)linux虛擬機(jī)中MySQL數(shù)據(jù)庫(kù)

    這篇文章主要介紹了如何Windows環(huán)境下訪問(wèn)linux虛擬機(jī)中MySQL數(shù)據(jù)庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論