最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL的InnoDB存儲引擎的數(shù)據(jù)頁結(jié)構(gòu)詳解

 更新時間:2022年03月02日 16:20:32   作者:小小茶花女  
這篇文章主要為大家詳細介紹了MySQL的InnoDB存儲引擎的數(shù)據(jù)頁結(jié)構(gòu),,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1 InnoDB頁的概念

InnoDB是一個將表中的數(shù)據(jù)存儲在磁盤上的存儲引擎,即使我們關(guān)閉并重啟服務(wù)器,數(shù)據(jù)還是存在。而真正處理數(shù)據(jù)的過程發(fā)生在內(nèi)存中,所以需要把磁盤中的數(shù)據(jù)加載到內(nèi)存中,所以需要把磁盤中的數(shù)據(jù)加載到內(nèi)存中。如果處理寫入和修改請求,還需要將內(nèi)存中的內(nèi)容刷新到磁盤上。而我們知道讀寫磁盤的速度非常慢,與讀寫內(nèi)存差了幾個數(shù)量級。當(dāng)我們想從表中獲取某些記錄時,InnoDB存儲引擎需要一條一條的把記錄從磁盤上讀出來么?不,那樣會慢死,InnoDB采取的方式是,將數(shù)據(jù)劃分為若干個頁,以頁作為磁盤和內(nèi)存之間交互的基本單位。InnoDB中頁的大小一般為16KB。也就是在一般情況下,一次最少從磁盤中讀取16KB的內(nèi)容到內(nèi)存中,一次最少把內(nèi)存中的16KB內(nèi)容刷新到磁盤中。

2 數(shù)據(jù)頁的結(jié)構(gòu)

存放表中記錄的叫索引頁也叫數(shù)據(jù)頁,數(shù)據(jù)頁代表的這塊16KB大小的存儲空間可以劃分為多個部分,不同部分有不同功能。

在這里插入圖片描述

我們自己存儲的記錄會按照指定的行格式存儲到User Records部分,但是一開始生成頁的時候,其實并沒有User Records部分,每當(dāng)插入一條記錄時,都會從Free Space部分申請一個記錄大小的空間,并將這個空間劃分到User Records部分。當(dāng)Free Records部分的空間全部被User Records部分替代掉之后,也就意味著這個頁被用完了,此時如果還有新的記錄插入,就需要去申請頁了。

在這里插入圖片描述

3 記錄在頁中的存儲

假如向page_demo表中插入4條記錄,那么這4條記錄的存儲方式為:

insert into page_demo values(1,100,'aaaa'),(2,200,'bbbb'),(3,300,'cccc'),(4,400,'dddd');

在這里插入圖片描述

無論向頁中插入了多少條記錄,InnoDB規(guī)定,任何用戶記錄都比infimum記錄大,任何用戶記錄都不supermum小。

通過記錄的存儲方式可以看到,記錄按照主鍵從小到大的順序形成了一個單向鏈表,通過一條記錄可以找到它的下一條記錄,下一條記錄指的并不是插入順序中的下一條記錄,而是按照主鍵值由小到大的順序排列的下一條記錄,而且規(guī)定infimum記錄的下一條記錄就是本頁中主鍵值最小的用戶記錄,本頁中主鍵值最大的用戶記錄的下一條記錄就是supermum記錄,supermum記錄是單向鏈表中的最后一個節(jié)點。

無論怎么對頁中的記錄進行增刪改查操作,InnoDB始終會維護記錄的一個單向鏈表,鏈表中的各個節(jié)點是按照主鍵值由小到大的順序鏈接起來的。

4 Page Directory頁目錄

我們知道記錄頁是按照主鍵值由小到大的順序串聯(lián)成了單向鏈表,如果想根據(jù)主鍵值查找頁中的某條記錄,該咋辦呢?比如下面的查詢語句:

select * from page_demo where c1=3;

最笨的方法就是從Infimum記錄開始,沿著單向鏈表一直往后找,而且在找的時候可以投機取巧,因為鏈表中各個記錄的值是按照從小到大的順序排列的,所以當(dāng)鏈表中的某個節(jié)點記錄的主鍵值大于想要查找的主鍵值時,就可以停止查找了。

當(dāng)頁中存儲的記錄數(shù)量比較少時,這種方法用起來沒有啥問題,但是,如果一個頁中存儲了非常多的記錄,遍歷操作對性能來說還是有損耗的,所以遍歷查找是一個笨方法,為此InnoDB設(shè)計了Page Directory頁目錄。

(1) 將所有正常的記錄(包括infinmumsupermum記錄)劃分為幾個組。InnoDB對每個分組的條數(shù)是有規(guī)定的,infimum記錄所在的分組只能有一條記錄,supermum記錄所在的分組擁有的記錄數(shù)只能在18條之間,剩下的分組中記錄的條數(shù)范圍只能在48之間。

(2) 將每個組中最后一條記錄在頁面中的地址偏移量單獨提取出來按順序存儲到靠近頁尾部的地方,這個地方就是Page Directory。

比如,現(xiàn)在page_demo有6條記錄,InnoDB會把他們分成2個組,第一組只有一個infimum記錄,第二組是剩余的5條記錄,2個組就對應(yīng)著兩個槽,每個槽存放著每個組中最大的那條記錄在頁面中的地址偏移量。

在這里插入圖片描述

由于現(xiàn)在page_demo表中的記錄太少,無法掩飾在添加頁目錄之后是如何加快查找速度的,所以再往page_demo表中添加一些記錄。

insert into page_demo 
values(1,100,'aaaa'),(2,200,'bbbb'),(3,300,'cccc'),(4,400,'dddd'),(5,500,'eeee'),(6,600,'ffff'),(7,700,'gggg'),(8,800,'hhhh'),(9,900,'iiii'),(10,1000,'jjjj'),(11,1100,'kkkk'),(12,1200,'llll'),(13,1300,'mmmm'),(14,1400,'nnnn'),(15,1500,'oooo'),
(16,1600,'pppp')

現(xiàn)在頁中就一共有18條記錄了(包括infimum記錄和supermum記錄),這些記錄被分成了5個組,因為各個槽之間是挨著的,而且他們代表的記錄的主鍵值都是從小到大排序的,所以可以使用二分法來快速查找。5個槽的編號跟別為0,1,2,3,4,所以初始情況下最低的槽就是low=0,最高的槽就是high=4,假如我們想要尋找主鍵值為6的記錄,過程就是這樣的:

在這里插入圖片描述

(1) 計算中間槽的位置:(0+4)/2=2,查看槽2對應(yīng)記錄的主鍵值8;又因為8>6,所以設(shè)置high=2,low保持不變。

(2) 重新計算中間槽的位置:(0+2)/2=1,查看槽1對應(yīng)的記錄的主鍵值為4,又因為4<6,所以設(shè)置low=1,high保持不變。

(3) 因為high-low=1,所以主鍵值為6的記錄在槽2對應(yīng)的組中,此時需要找到槽2所在分組中主鍵值最小的那條記錄,然后沿著單向鏈表遍歷槽2中的記錄。

綜上所述,在一個數(shù)據(jù)頁中查找指定主鍵值的記錄時,過程分為2步:

(1) 通過二分法確定該記錄所在分組對應(yīng)的槽,然后找到該槽所在分組中主鍵值最小的那條記錄。

(2) 通過記錄的next_record屬性遍歷該槽所在分組中的各個記錄。

5 File Header文件頭部

InnoDB是以頁為單位存放數(shù)據(jù)的,有時在存放某種類型的數(shù)據(jù)時,占用的空間非常大。InnoDB可能無法一次性為這么多數(shù)據(jù)分配一個非常大的存儲空間,而如果分散到多個不連續(xù)的頁中進行存儲,則需要把這些也關(guān)聯(lián)起來,FIL_PAGE_PREVFIL_PAGE_NEXT就分別代表本數(shù)據(jù)頁的上一個頁和下一個頁的頁號。這樣通過建立一個雙向鏈表就把許許多多的頁串聯(lián)起來了,而無須這些也在物理上真正連著。所以存儲記錄的數(shù)據(jù)頁其實可以組成一個雙向鏈表。

在這里插入圖片描述

6 InnoDB頁和記錄的關(guān)系

各個數(shù)據(jù)頁可以組成一個雙向鏈表,而每個數(shù)據(jù)頁中的記錄會按照主鍵值從小到大的順序組成一個單向鏈表,每個數(shù)據(jù)頁都會為存儲在它里面的記錄生成一個頁目錄,在通過主鍵查找某條記錄的時候可以在頁目錄中使用二分法快速定位到對應(yīng)的槽,然后遍歷該槽對應(yīng)分組中的記錄即可快速找到指定的記錄。

在這里插入圖片描述

7 沒有索引時查找記錄

1、在一個頁中查找:

假設(shè)現(xiàn)在表中的記錄較少,所有的記錄都可以存放在一個頁中,在查找記錄時,可以根據(jù)搜索條件的不同可以分為兩種情況:

(1) 以主鍵為搜索條件:可以在頁目錄中使用二分法快速定位到指定的槽,然后遍歷該槽對應(yīng)分組中的記錄,即可快速定位到指定的記錄。

(2) 以其他列作為搜索條件:對于非主鍵列的查找就沒有那么幸運了,因為在數(shù)據(jù)頁中并沒有為非主鍵列建立所謂的頁目錄,所以無法通過二分法快速定位相應(yīng)的槽,在這種情況下只能從Infimum記錄開始依次遍歷單向鏈表中的每條記錄,然后對比每條記錄是否符合搜索條件,這種查找的效率非常低。

2、在很多頁中查找:

在很多時候,表中存放的記錄都是非常多的,需要用到好多的數(shù)據(jù)頁來存儲這些記錄。在很多頁中查找記錄可以分為兩個步驟:

(1) 定位到記錄所在的頁;

(2) 從所在的頁內(nèi)查找相應(yīng)的記錄;

在沒有索引的情況下,無論是根據(jù)主鍵列還是其他的列進行查找,由于我們不能快速的定位到記錄所在的頁,所以只能從第一頁沿著雙向鏈表一直往下找。在每一頁中我們根據(jù)上面說的查找方式去查找指定的記錄。因為要遍歷所有的數(shù)據(jù)頁,所以這種方式顯然是超級耗時的。如果一個表有一億條記錄,使用這種方式去查找記錄,估計要到猴年馬月才能查到結(jié)果,所以就需要一種能高效完成搜索的方法,即索引。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!  

相關(guān)文章

  • Mysql中的select ...for update

    Mysql中的select ...for update

    這篇文章主要介紹了Mysql中的select ...for update用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • mysql?binlog查看指定數(shù)據(jù)庫的操作方法

    mysql?binlog查看指定數(shù)據(jù)庫的操作方法

    MySQL 的 binlog(二進制日志)主要記錄了數(shù)據(jù)庫上執(zhí)行的所有更改數(shù)據(jù)的 SQL 語句,包括數(shù)據(jù)的插入、更新和刪除等操作這篇文章主要介紹了mysql?binlog查看指定數(shù)據(jù)庫的方法,需要的朋友可以參考下
    2024-06-06
  • CentOS下重置MySQL的root密碼的教程

    CentOS下重置MySQL的root密碼的教程

    這篇文章主要介紹了CentOS下重置MySQL的root密碼的教程,首先要擁有系統(tǒng)的root權(quán)限,最后還附屬了一個使用mysqladmin下的方法,需要的朋友可以參考下
    2015-11-11
  • mysql聚集索引、輔助索引、覆蓋索引、聯(lián)合索引的使用

    mysql聚集索引、輔助索引、覆蓋索引、聯(lián)合索引的使用

    本文主要介紹了mysql聚集索引、輔助索引、覆蓋索引、聯(lián)合索引的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 一文弄懂MySQL中redo?log與binlog的區(qū)別

    一文弄懂MySQL中redo?log與binlog的區(qū)別

    在學(xué)習(xí)mysql數(shù)據(jù)庫時,不可避免要去接觸到redo log和binlog,好多人對這兩者的概念分不太清,下面這篇文章主要給大家介紹了關(guān)于MySQL中redo?log與binlog區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • MySQL ALTER命令使用詳解

    MySQL ALTER命令使用詳解

    這篇文章主要為大家詳細介紹了MySQL ALTER命令的使用方法,簡單實用,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Windows?Server?2019?MySQL數(shù)據(jù)庫的安裝與配置理論+遠程連接篇

    Windows?Server?2019?MySQL數(shù)據(jù)庫的安裝與配置理論+遠程連接篇

    mysql是一款關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由MySQL?AB公司開發(fā),目前屬于Oracle旗下產(chǎn)品,MySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一。MySQL也是一款開源的SQL數(shù)據(jù)庫管理系統(tǒng),是眾多小型網(wǎng)站作為網(wǎng)站數(shù)據(jù)庫的首選數(shù)據(jù)庫
    2023-05-05
  • mysql格式化字符串長度不夠補0問題

    mysql格式化字符串長度不夠補0問題

    這篇文章主要介紹了mysql格式化字符串長度不夠補0問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • MySQL深分頁問題及三種解決方案

    MySQL深分頁問題及三種解決方案

    本文主要介紹了MySQL深分頁問題及三種解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 圖文詳解Mysql索引的最左前綴原則

    圖文詳解Mysql索引的最左前綴原則

    最左前綴原則是發(fā)生在復(fù)合索引上的,只有復(fù)合索引才會有所謂的左和右之分,下面這篇文章主要給大家介紹了關(guān)于Mysql索引的最左前綴原則的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-03-03

最新評論

沙洋县| 天峻县| 东辽县| 马山县| 肃宁县| 阜平县| 新绛县| 扎囊县| 白玉县| 青浦区| 阿克| 新疆| 北川| 改则县| 贵阳市| 泰顺县| 巨鹿县| 巴东县| 鲜城| 阳山县| 连州市| 佛教| 望城县| 义乌市| 芦山县| 开原市| 册亨县| 昌江| 东宁县| 宣城市| 芦山县| 榆中县| 科尔| 建平县| 辽阳县| 横峰县| 扶沟县| 桃园市| 涞源县| 河曲县| 伊通|