亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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查看event執(zhí)行記錄的實現(xiàn)

    MySQL查看event執(zhí)行記錄的實現(xiàn)

    在使用EVENT的過程中,我們可能會需要查看EVENT的執(zhí)行記錄,以便了解它們是否按預(yù)期執(zhí)行,本文就來介紹一下MySQL查看event執(zhí)行記錄的實現(xiàn),感興趣的可以了解一下
    2023-11-11
  • MySQL優(yōu)化之大字段longtext、text所生產(chǎn)的問題

    MySQL優(yōu)化之大字段longtext、text所生產(chǎn)的問題

    本文主要介紹了MySQL優(yōu)化之大字段longtext、text所生產(chǎn)的問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • MySQL order by與group by查詢優(yōu)化實現(xiàn)詳解

    MySQL order by與group by查詢優(yōu)化實現(xiàn)詳解

    order by 子句盡量使用index方式排序(即using index),避免使用filesort方式排序(即using filesort)。Index方式效率高,它指MySQL掃描索引本身完成排序,filesort則效率低
    2022-11-11
  • MySQL中的常用工具實例匯總(推薦)

    MySQL中的常用工具實例匯總(推薦)

    MySQL數(shù)據(jù)庫以體積小、速度快、總體擁有成本低等優(yōu)點,深受廣大中小企業(yè)的喜愛,下面這篇文章主要給大家介紹了關(guān)于MySQL中常用工具的相關(guān)資料,需要的朋友們可以參考學(xué)習(xí),下面來一起看看吧。
    2017-09-09
  • Python MySQL進行數(shù)據(jù)庫表變更和查詢

    Python MySQL進行數(shù)據(jù)庫表變更和查詢

    這篇文章主要介紹了Python MySQL進行數(shù)據(jù)庫表變更和查詢的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • SQL SERVER 日期格式轉(zhuǎn)換詳解

    SQL SERVER 日期格式轉(zhuǎn)換詳解

    本篇文章是對SQL SERVER 日期格式轉(zhuǎn)換進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • mysql解決遠程不能訪問的二種方法

    mysql解決遠程不能訪問的二種方法

    mysql解決遠程不能訪問的二種方法,需要的朋友可以參考一下
    2013-04-04
  • mysql命令導(dǎo)出表結(jié)構(gòu)和數(shù)據(jù)的操作方法

    mysql命令導(dǎo)出表結(jié)構(gòu)和數(shù)據(jù)的操作方法

    在日常使用中,我們經(jīng)常需要對數(shù)據(jù)庫進行備份和復(fù)制,因此必須了解如何導(dǎo)出表結(jié)構(gòu)和表數(shù)據(jù),以下是使用MySQL命令導(dǎo)出表結(jié)構(gòu)和表數(shù)據(jù)的方法,感興趣的朋友一起看看吧
    2023-11-11
  • Mysql中Json相關(guān)的函數(shù)使用

    Mysql中Json相關(guān)的函數(shù)使用

    本文主要介紹了Mysql當(dāng)中Json相關(guān)的函數(shù)使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • mysql實現(xiàn)定時備份的詳細圖文教程

    mysql實現(xiàn)定時備份的詳細圖文教程

    這篇文章主要給大家介紹了關(guān)于mysql實現(xiàn)定時備份的詳細圖文教程,我們都知道數(shù)據(jù)是無價,如果不對數(shù)據(jù)進行備份,相當(dāng)是讓數(shù)據(jù)在裸跑,一旦服務(wù)器出問題,只有哭的份了,需要的朋友可以參考下
    2023-07-07

最新評論