mysql的Innodb引擎的儲存結構和索引

2021-10-04 03:38:57 字數 2216 閱讀 7964

首先,需要了解的是mysql的innodb儲存結構是一顆b+樹。

b+樹的結構如下圖:

可以看出,b+樹和二叉樹的區別:

(1)乙個節點裡面可以訪問多個元素

(2)葉子節點和葉子節點之間有指標;

(3)所有非葉子節點在葉子節點中有冗餘(就是所有非葉子節點在最下面的葉子節點上都有乙個備份)。

其中,(2)(3)性質也是b+樹和b-樹的區別;

其次,我們需要了解的是,當我們與資料庫互動時,其過程是,從磁碟i/o一次,把資料讀取到記憶體中。在i/o的過程中,我們不是一條一條的取資料,而是和作業系統一樣,有乙個邏輯的分頁,每次讀取一頁(16k)的資料到記憶體中(作業系統一頁是4k),然後查詢所需資料。innodb_page_size屬性預設設定一頁16k。

**innodb的儲存結構如下圖(預設主鍵,無其他索引):**斜體樣式

(1)某一頁結構。

資料儲存以鍊錶的形式儲存在使用者資料區域,預設以主鍵排序,從小到大插入。這樣雖然影響插入的效率,但是有利於查詢。

頁目錄儲存著目錄項,一般預設右邊六條資料為乙個目錄項,目錄項儲存每組開頭的主鍵(預設)或者使用者自定義的索引(下面圖為兩條資料為一組),然後指標分別指向使用者資料區域的每一行資料。一頁預設儲存16k資料。

根據主鍵(索引)查詢某條資料,會先定位在某一頁,然後在頁目錄上查,找到資料後關聯這條資料,不需要全表查詢。

頁目錄容易形成長鍊表,所以提公升查詢效率,改為b+樹,利用二分法查詢)

一頁兩個目錄項:

(2)多頁之間的聯絡

多頁之間也是通過指標鏈結,形成乙個長鍊表,所以也改為b+樹。通過b+樹快速定位索引在某頁的某個目錄項裡面,然後查詢資料(預設6行)。

多頁之間的b+樹:

建表時,設定n個索引,就建立n個b+樹,聯合索引(b,c,d)為一條索引。下面一a為主鍵,(b,c,d)為聯合索引舉例。

聯合索引的特殊之處在於,目錄項中儲存著(b,c,d)的值,假如b=1,c=1,d=1,目錄項在b+樹的節點為:

為了避免聯合索引b+樹的葉子節點上冗餘太多的資料,所以只選擇了聯合索引(b,c,d)的值和主屬性a的值作為一條資料行。檢索過程為,查詢聯合索引b+樹,找到具體的某一行資料,通過主屬性a關聯的主鍵b+樹,回表查詢到具體的資料行。

聯合索引的b+樹如下圖:

這個裡面就有很多值得注意的地方,比如:

(1)select * from table where c=1 and d= 1;不會走聯合索引,會全表查詢。因為根據c和d的值,無法通過b+樹查詢;

*(2)*select * from table where b=1; 會走聯合索引,理由和上條相反。具體可查

explain select * from table where b=1 檢視。

(3)select a,b,c,d from table where b >1;會走聯合索引,這個很好理解。

(4)select a,b,c,d,e from table where b >1;可以走聯合索引,但是卻走的全表掃瞄。因為聯合索引上的葉子節點沒有存屬性e,這樣查完聯合索引b+樹,還要回表到主鍵b+樹,查詢具體的資料。

(5)select a,b,c,d from table;這個走聯合索引,很迷。應該是掃瞄聯合索引的所有葉子節點。這樣比全表掃瞄的資料量要少。

總結:mysql的innodb通過索引去查詢某些資料,是通過索引b+樹,首先定位該資料在某頁,然後定位在某個目錄項裡面,然後遍歷目錄項裡面的資料行查詢到某條資料。需要關注的是,聯合索引的那個例子,可以提供mysql優化的思路。

MySQL的儲存引擎INNODB

1 一般情況下,mysql會預設提供多種儲存引擎,你可以通過下面的檢視 看你的mysql現在已提供什麼儲存引擎 mysql show engines 看你的mysql當前預設的儲存引擎 mysql show variables like storage engine 你要看某個錶用了什麼引擎 在顯示...

mysql的innodb儲存引擎

innodb是支援事務的儲存引擎,支援acid特性的acid 指資料庫事務正確執行的四個基本要素的縮寫 包含 原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 更適合處理大量的小事務,小事務正常都會被提交,很少會被回滾,在資料儲存的...

mysql的Innodb儲存引擎學習

總是記不住事情,已經看過好幾本mysql的書了,但是不經常用,很多基礎性的東西又都忘了,從今天開始,將重新看mysql的書籍,並做相應的記錄 innodb儲存引擎 1.支援事務安裝 innodb 在功能方面最重要的一點就是對事務安全的支援,這無疑是讓 innodb 成為 mys ql最為流行的儲存引...