學習筆記 mysql索引原理之InnoDB

2021-09-20 01:43:50 字數 2146 閱讀 1411

innodb是事務安全的mysql儲存引擎,在oltp的應用中,innodb應該作為核心應用表的首選儲存引擎。

1、執行緒

後台的執行緒主要負責:重新整理記憶體池中的資料,保證緩衝池中的記憶體快取的是最近的資料;將已修改的資料檔案重新整理到磁碟檔案;保證在資料庫發生異常情況下innodb能恢復到正常狀態。

innodb儲存引擎在乙個叫master thread的執行緒上幾乎完成了所有的功能。預設情況下, innodb儲存引擎的後台執行緒有7個——4個io thread、1個master thread、1個lock監控執行緒、1個錯誤監控執行緒。4個io執行緒分別是insert buffer thread、log thread、read thread、write thread,執行緒數可以通過檔案配置。

2、資料結構

innodb的所有資料的邏輯儲存空間成為表空間,表空間由段組成。段主要分為資料段、索引段等,資料段其實就是b+tree的葉子節點,而索引段就是內節點。

段裡面又分為區,每個區由64個連續的頁組成,每頁16k,即每個區1m。對於大的資料段,最多可申請4個區,以保證資料的連續性。

頁的資料結構如圖所示,file header、page header、file trailer的大小是固定的,用來標示該頁的一些資訊,如checksum、資料所在的索引層、該頁的前乙個頁和後乙個頁的位址等。

page directory,頁字典,存放的是記錄在頁中的相對位址,這是個稀疏目錄,即並不是每條記錄都會在目錄中。因為即使在同一頁中,記錄的存放也是順序存放的,比如想找到"h",即使"h"不在目錄中,那麼只需找到"g",再按"g"記錄的指標順序往下查詢即可,所以無需每條記錄都放入目錄中。

因為頁是最小儲存單位,io操作都是按頁來的,所以聚簇索引的b+tree葉子節點存放的其實並非記錄本身,而是記錄所在的頁,然後把頁讀到記憶體中,再根據page directory二叉查詢到記錄,這個二叉查詢是在記憶體中進行的,所以時間幾乎可以忽略。

3、索引操作

對索引的插入、修改、刪除操作,自然就得提到innodb的緩衝池。主鍵的索引是聚簇索引,所以聚簇索引的插入都是順序讀取,而非隨機讀取的,這樣的操作無需使用緩衝池。但非聚簇索引的插入,由於b+樹的特性,就需要離散的訪問非聚集索引頁,而且很大可能會涉及到頁**等操作,插入的效能相對較低。緩衝池就是為了解決這類問題,非聚簇索引的插入,並非每一次都直接插入到索引頁中,會先放入緩衝池,然後以一定的頻率進行合併操作,再插入到索引頁。

索引的新增或刪除操作,會先建立乙個新的臨時表,把資料匯入到臨時表,在臨時表上建立完或刪除完索引,再把原表刪除,最後重新命名臨時表。因此新增或刪除索引,對大表而言,代價是比較巨大的,更有可能,會出現表丟失等現象。針對非聚簇索引,innodb支援一種快捷方式,對錶加鎖,這樣就不需要臨時表。

4、索引查詢優化

innodb會監控對錶索引的查詢,建立hash索引,即自適應索引,這個索引並非對全表建索引,而是自動根據訪問頻率和模式來對某些頁建立索引,不能人為干預的,用於等於查詢,以提高查詢效率。

多個索引的聚合查詢,mysql會有乙個統計機制來記錄全表資料記錄條數與各個索引的索引條數的比值,比如:全表記錄10000條,city索引條數為1000條,那麼其比值為10000/1000=10,status索引條數為10條,其比值為10000/10=1000,那麼如果where city=1 and status=2,mysql會使用city索引,因為city索引的比值比status小很多,查出結果集自然會小很多。但如果兩個索引的比值相差不大,mysql會把兩個索引查出的結果集進行聚合。不過通常的查詢都只會使用乙個索引,畢竟兩個索引查出的結果集進行聚合的代價也不小。

非聚簇索引的查詢,最後一步通常是根據主鍵再到聚簇索引上查一次拿到記錄,如果非聚簇索引查出1000條資料,就需要做1000次聚簇索引的查詢。當然,mysql在這一步也進行了一些優化,比如先對主鍵排一下序再進行聚簇索引的查詢,減少i/o。但如果只需要非聚簇索引上的資料,就無需再走這一步了。

涉及排序時,也是一樣的,如果排序的字段與where條件的字段一起建立聯合索引,那麼查詢速度會快很多。比如,where status=1 order by city,聯合索引為status,city,索引本來就是有序的,拿到status=1條件過濾之後的結果,再到聚簇索引上查詢一下就可以拿到最終結果了。但,如果聯合索引是city,status,就不能用了,查詢就慢啦。這就是什麼左綴原則。

MySQL索引原理之索引原理

索引定義 是儲存引擎用於快速查詢記錄的一種資料結構。需要額外開闢空間和資料維護工作。索引是物理資料頁儲存,在資料檔案中 innodb,ibd檔案 利用資料頁 page 儲存。索引可以加快檢索速度,但是同時也會降低增刪改操作速度,索引維護需要代價。索引涉及的理論知識 二分查詢法 hash和b tree...

MYSQL學習筆記之索引

首先先看一下索引這個詞在詞典中的定義 指將文獻中具有 檢索意義 的事項 可以是人名 地名 詞語 概念 或其他事項 按照一定方式 有序編排起來,以供 檢索的工具書。從上面的標紅的關鍵字來看索引有兩個特點 1 索引是供使用者搜尋時所用的工具。2 索引是有序的 在mysql中索引是儲存引擎快速找到記錄的一...

Mysql學習之索引介紹及其原理

1 索引的分類 1 單值索引 即乙個索引只包含單個列,乙個表可以有多個單值索引。2 唯一索引 索引列的值必須唯一,但是允許有空值。3 復合索引 即乙個索引包含多個列。2 語法 1 建立 create unique index indexname on mytable columnname lengt...