偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

InnoDB原理篇:聊聊數(shù)據(jù)頁變成索引這件事

數(shù)據(jù)庫 其他數(shù)據(jù)庫
如果沒有索引,查詢速度可以說是慢到驚人,一般是不能讓查詢走全表掃描的。因此數(shù)據(jù)庫中的查詢,必須要運用索引來加速。

數(shù)據(jù)頁

我們都知道平時執(zhí)行crud的時候,都會從磁盤上加載數(shù)據(jù)頁到Buffer Pool的緩存頁里去,更新緩存頁后,由異步線程刷回磁盤的數(shù)據(jù)頁。

所以MySQL進行數(shù)據(jù)操作的最小單位是數(shù)據(jù)頁,接下來就分析分析,數(shù)據(jù)頁到底長什么樣。

每個數(shù)據(jù)頁默認16kb的大小,數(shù)據(jù)頁由多個部分組成,如下圖所示:

當然這么多概念,阿星只會挑重點,循循漸進的講,所以大家莫慌。

空閑空間

其實數(shù)據(jù)頁還未寫入數(shù)據(jù)時,是沒有數(shù)據(jù)行的,只有空閑空間,一旦寫入,空閑空間會減少一些,直到空閑空間耗盡,具體過程如下圖

數(shù)據(jù)頁滿了,自然需要開辟新的數(shù)據(jù)頁出來存儲數(shù)據(jù)。

但是隨著數(shù)據(jù)頁多起來,它們怎么知道上一頁與下一頁在那呢?

雙向鏈表

其實在數(shù)據(jù)頁文件頭中存放了特別多的信息,如當前頁號、頁類型、所屬表空間、上一頁號、下一頁號等等。

所以數(shù)據(jù)頁是通過上下頁號,組成雙向鏈表,如下圖所示

數(shù)據(jù)頁內(nèi)部會存儲一行一行的數(shù)據(jù),每一行數(shù)據(jù)都會按照主鍵大小進行排序存儲,同時每一行數(shù)據(jù)都有指針指向下一行數(shù)據(jù),組成單向鏈表。

但是這個結(jié)構(gòu)并不高效,假設根據(jù)主鍵ID查詢數(shù)據(jù),只能進入數(shù)據(jù)頁,挨個挨個的對單向鏈表遍歷查詢。

所以要再加點料,把二分查找利用起來(不知道二分查找是什么,建議百度,這是最基礎(chǔ)算法)

數(shù)據(jù)頁目錄

這個料就是數(shù)據(jù)頁目錄部分,數(shù)據(jù)頁目錄存儲的內(nèi)容就是主鍵ID和行位置。

這樣就可以通過數(shù)據(jù)頁目錄走二分查找,快速定位到數(shù)據(jù)頁內(nèi)的數(shù)據(jù)行。

如果只有一個數(shù)據(jù)頁,倒沒啥問題,哪有成千上萬個數(shù)據(jù)頁呢,還是得一個一個進數(shù)據(jù)頁,搜索數(shù)據(jù)頁目錄。

有沒有覺得,這似乎是在做全表掃描?

沒錯,在沒有索引的情況下,數(shù)據(jù)庫就是這樣執(zhí)行的。

索引

如果沒有索引,查詢速度可以說是慢到驚人,一般是不能讓查詢走全表掃描的。

因此數(shù)據(jù)庫中的查詢,必須要運用索引來加速。

頁分裂

在說索引之前,先說個前置知識,索引的核心基礎(chǔ)要求后一個數(shù)據(jù)頁的主鍵值都大于前面一個數(shù)據(jù)頁的主鍵值,如果你的主鍵是自增的,可以保證這一點。

但有時候主鍵并不是自增長的,可能會出現(xiàn)后一個數(shù)據(jù)頁的主鍵值小于前一個數(shù)據(jù)頁的主鍵值。

為了保證索引的核心基礎(chǔ),有個交換行數(shù)據(jù)的過程,這個過程叫頁分裂。

過程如下

  • 數(shù)據(jù)頁0的id=6行數(shù)據(jù)挪到數(shù)據(jù)頁1
  • 數(shù)據(jù)頁1的頁目錄更新
  • 數(shù)據(jù)頁1的id=3行數(shù)據(jù)挪到數(shù)據(jù)頁0
  • 數(shù)據(jù)頁0的頁目錄更新

主鍵目錄

好了,現(xiàn)在我們以主鍵為例,創(chuàng)建一個主鍵索引,這個主鍵索引就是主鍵目錄,它會維護所有數(shù)據(jù)頁的最小主鍵值與對應的頁號。

有了主鍵目錄的加持,那找數(shù)據(jù)就非??炝?,過程如下

  • 二分查找主鍵目錄,找到對應的數(shù)據(jù)頁
  • 進入數(shù)據(jù)頁,二分查找數(shù)據(jù)頁目錄,找到對應的行數(shù)據(jù)

可是又來一個新問題,表里的數(shù)據(jù)可能有幾百萬,幾千萬,甚至幾億條數(shù)據(jù),會有大量的數(shù)據(jù)頁,意味著主鍵目錄要存儲大量的數(shù)據(jù)頁號和最小主鍵值。

可能主鍵目錄存儲不下,就算能存儲,海量的數(shù)據(jù)僅僅靠二分查找也很吃力。

所以InnoDB實際上是把主鍵目錄數(shù)據(jù)存儲在多個數(shù)據(jù)頁中,我們把這個數(shù)據(jù)頁稱為索引頁

索引頁

索引頁,顧名思義,就是存儲索引信息的數(shù)據(jù)頁,在數(shù)據(jù)頁的文件頭部,有頁類型來進行區(qū)分。

索引頁會存儲兩類內(nèi)容,一類是最小主鍵值與索引頁號,另一類是最小主鍵值與數(shù)據(jù)頁號。

把大量的索引信息分散在多個索引頁中,再將多個索引頁組建成B+樹結(jié)構(gòu),方便二分查找,結(jié)構(gòu)如下圖

一直說InnoDB的索引是用B+樹來組成的,其實就是這個意思,當然真實的B+樹不長這樣,這樣畫還是為了幫助大家理解。

現(xiàn)在整個搜索過程就十分簡單了

  • 根據(jù)主鍵id二分查找索引頁
  • 找到對應索引頁,再二分查找數(shù)據(jù)頁
  • 進入數(shù)據(jù)頁,二分查找數(shù)據(jù)頁目錄,找到對應的行數(shù)據(jù)

寫到這里就結(jié)束了,通過數(shù)據(jù)頁到最后的索引,體會這個優(yōu)化的過程,才是本文的重點,由于篇幅有限,索引的內(nèi)容后面會單獨講解。


責任編輯:武曉燕 來源: 程序猿阿星
相關(guān)推薦

2022-03-02 10:11:41

索引場景數(shù)據(jù)庫

2023-07-03 22:28:19

6GHz6G技術(shù)

2022-10-19 09:05:45

編譯程序員后端

2023-05-15 09:06:39

2023-05-12 17:45:15

MySQL索引排序

2021-03-04 08:06:17

Redis面試模型

2021-06-09 10:29:23

Kafka架構(gòu)組件

2021-04-09 08:54:14

Kafka源碼架構(gòu)開發(fā)技術(shù)

2023-11-07 16:24:49

成員權(quán)限管理

2021-02-21 06:33:27

存儲引擎物聯(lián)網(wǎng)

2022-02-25 08:54:50

setState異步React

2015-08-24 08:51:01

程序員讀書

2021-02-20 20:51:24

工具內(nèi)核kprobe

2021-08-23 08:27:43

innodb數(shù)據(jù)庫存儲引擎

2015-09-16 14:20:25

2018-07-10 08:56:19

編程程序員開發(fā)

2019-05-06 14:28:09

英特爾處理器架構(gòu)

2013-01-16 09:56:46

程序員跳槽面試

2019-08-15 10:33:23

大數(shù)據(jù)IT互聯(lián)網(wǎng)

2018-07-20 11:10:27

男人養(yǎng)家大數(shù)據(jù)
點贊
收藏

51CTO技術(shù)棧公眾號