中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql的索引底層之實現原理是什么

發布時間:2020-10-23 17:30:22 來源:億速云 閱讀:351 作者:小新 欄目:MySQL數據庫

這篇文章主要介紹了mysql的索引底層之實現原理是什么,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

MySQL索引背后的數據結構及算法原理

一、定義

索引定義:索引(Index)是幫助MySQL高效獲取數據的數據結構。
本質:索引是數據結構。

二、B-Tree

m階B-Tree滿足以下條件:
1、每個節點至多可以擁有m棵子樹。
2、根節點,只有至少有2個節點(要么極端情況,就是一棵樹就一個根節點,單細胞生物,即是根,也是葉,也是樹)。
3、非根非葉的節點至少有的Ceil(m/2)個子樹(Ceil表示向上取整,如5階B樹,每個節點至少有3個子樹,也就是至少有3個叉)。
4、非葉節點中的信息包括[n,A0,K1,A1,K2,A2,…,Kn,An],,其中n表示該節點中保存的關鍵字個數,K為關鍵字且Ki<Ki+1,A為指向子樹根節點的指針。
5、從根到葉子的每一條路徑都有相同的長度(葉子節點在相同的層)

B-Tree特性:

mysql的索引底層之實現原理是什么

1、關鍵字集合分布在整顆樹中;
2、任何一個關鍵字出現且只出現在一個節點中;
3、每個節點存儲date和key;
4、搜索有可能在非葉子節點結束;
5、一個節點中的key從左到右非遞減排列;
6、所有葉節點具有相同的深度,等于樹高h。

B-Tree上查找算法的偽代碼如下:
mysql的索引底層之實現原理是什么

三、B+Tree

mysql的索引底層之實現原理是什么

B+Tree與B-Tree的差異在于:
1、B+Tree非葉子節點不存儲data,只存儲key;
2、所有的關鍵字全部存儲在葉子節點上;
3、每個葉子節點含有一個指向相鄰葉子節點的指針,帶順序訪問指針的B+樹提高了區間查找能力;
4、非葉子節點可以看成索引部分,節點中僅含有其子樹(根節點)中的最大(或最小)關鍵字;

四、B/B+樹索引的性能分析

依據:使用磁盤I/O次數評價索引結構的優劣
主存和磁盤以頁為單位交換數據,將一個節點的大小設為等于一個頁,因此每個節點只需一次I/O就可以完全載入。
根據B樹的定義,可知檢索一次最多需要訪問h個節點
漸進復雜度:O(h)=O(logdN)
dmax=floor(pagesize/(keysize+datasize+pointsize))
一般實際應用中,出度d是非常大的數字,通常超過100,因此h非常小(通常不超過3,3層可存大約一百萬數據)
B-Tree中一次檢索最多需要h-1次I/O(根節點常駐內存)
B+Tree內節點不含data域,因此出度d更大,則h更小,I/O次數少,效率更高,故B+Tree更適合外存索引。

五、MySQL索引實現
1、MyISAM引擎使用B+Tree作為索引結構,葉節點的data域存放的是數據記錄的地址;
    MyISAM主索引和輔助索引在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重復;

2、InnoDB的數據文件本身就是索引文件,葉節點包含了完整的數據記錄,這種索引叫做聚集索引。
因為InnoDB的數據文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定,則MySQL系統會自動選擇一個可以唯一標識數據記錄的列作為主鍵,如果不存在這種列,則MySQL自動為InnoDB表生成一個隱含字段作為主鍵。
    InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址;
    輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄;

3、頁分裂問題

mysql的索引底層之實現原理是什么

如果主鍵是單調遞增的,每條新記錄會順序插入到頁,當頁被插滿后,繼續插入到新的頁;

如果寫入是亂序的,InnoDB不得不頻繁地做頁分裂操作,以便為新的行分配空間。頁分裂會導致移動大量數據,一次插入最少需要修改三個頁而不是一個頁。

如果頻繁的頁分裂,頁會變得稀疏并被不規則地填充,所以最終數據會有碎片。

六、總結

了解不同存儲引擎的索引實現方式對于正確使用和優化索引都非常有幫助

1、為什么不建議使用過長的字段作為主鍵?

2、為什么選擇自增字段作為主鍵?

3、為什么常更新是字段不建議建立索引?

4、為什么選擇區分度高的列作為索引?區分度的公式是count(distinct col)/count(*)

5、盡可能的使用覆蓋索引

七、優化LIMIT分頁查詢

SELECT * FROM table  where condition LIMIT offset , rows ;

上述SQL語句的實現機制是:
 1、從“table”表中讀取offset+rows行記錄。
 2、 拋棄前面的offset行記錄,返回后面的rows行記錄作為最終的結果。
覆蓋索引:

select  a.id, sid, parent_s_id from cashpool_account_relationship a join (select id from cashpool_account_relationship LIMIT 1000000,10)b on a.id = b.id;
select  id, sid, parent_s_id from cashpool_account_relationship where id >=(select id from cashpool_account_relationship LIMIT 1000000,1) LIMIT 10;

八、Q&A

1、InnoDB支持hash索引嗎?--馬欣
InnoDB是支持hash索引的,不過其支持的hash索引是自適應的,InnoDB存儲引擎會根據表的使用情況自動為表生成hash索引,不能人為干預是否在一張表中生成hash索引。
2、InnoDB主鍵索引的葉節點含完整的數據記錄,那主鍵索引文件要比數據文件大嗎?--徐財厚
1).在Innodb 引擎中,主鍵索引中的葉子結點包含記錄數據,主鍵索引文件即為數據文件。
2).在 tables 表中統計的data_length數據為主鍵索引大小,index_length 為統計的這個表中所有輔助索引(二級索引)索引的大小。
mysql的索引底層之實現原理是什么

感謝你能夠認真閱讀完這篇文章,希望小編分享mysql的索引底層之實現原理是什么內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

舞钢市| 沙雅县| 七台河市| 武鸣县| 百色市| 玉山县| 洛宁县| 禄劝| 璧山县| 太保市| 郁南县| 白山市| 岗巴县| 德安县| 邻水| 胶南市| 宁南县| 手游| 垦利县| 大关县| 新河县| 休宁县| 湘潭市| 永川市| 子洲县| 平塘县| 盐津县| 汕尾市| 梁山县| 吉水县| 呼和浩特市| 乌鲁木齐县| 泽普县| 河源市| 营口市| 贡山| 邵阳县| 黑龙江省| 尼木县| 五大连池市| 海晏县|