MySQL索引底層原理理解以及常見問題總結

目錄

    • 二叉查找樹為索引
    • 紅黑樹為索引
    • B樹作為索引
    • B+樹作為索引
    • MyISAM存儲引擎索引實現
    • InnoDB存儲引擎索引實現
    • 常見問題
      • 聚集索引與非聚集索引
      • InnoDB基于主鍵索引和普通索引的查詢有什么區別?
      • InnoDB主鍵索引為何是整型的自增主鍵
      • 何時使用業務字段作為主鍵呢?
      • 哈希與B樹
    • “N叉樹”的N值在MySQL中是可以被人工調整的么?

二叉查找樹為索引

二叉樹的key為col2,value為索引所在行的磁盤地址。
但如果拿col1來作為key的話,會發現二叉搜索樹退化成鏈表。
在這里插入圖片描述

紅黑樹為索引

仍然以col1作為索引key,發現找6只需要查找3次。比二叉查找樹更加合適一點
在這里插入圖片描述
當表中有1百萬行數據時,這棵樹的高度會越來越大。如果我們查找的元素在葉子節點,查找次數會非常多。

B樹作為索引

可以在樹的橫向上做文章,每個節點原本只存儲一行數據的地址,現在可以修改為存儲多行數據。因為樹的高度越多說明IO操作越多,導致與磁盤的交互越多。
B樹:
葉節點具有相同的深度,葉節點的指針為空。
所有的索引元素不重復
節點中數據索引從左到右遞增排列
在這里插入圖片描述

B+樹作為索引

B+樹
非葉子節點不存儲data,只存儲索引,這樣可以放更多索引
葉子節點包含所有索引字段。
葉子節點用指針連接,提高區間訪問性能。

也就是說在葉子節點存儲了完整的元素,然后把一些處于中間位置的索引元素提取出來,作為非葉子節點。
MySQL設置默認節點大小為16kb,一個bigint為8byte,一個指針為6byte。所以一個節點最多能存16kb/14b = 1170。
再假設葉子節點一個元素占空間大小為1kb。
如果全部節點存儲了滿了,h = 3的時候一共能夠存儲1170 * 1170 * 16 = 21902400;這樣可以存兩千多萬個數據了。
在這里插入圖片描述
以下面為例:
注意,整個樹都放在磁盤中,每次load一個節點進入內存。一般來說,先從根節點開始load。
我們現在要找6。比對根節點的3,6大于3,向右比較,發現6大于5,于是從5右邊的指針找到下面一層的節點.
然后把這一層的節點從磁盤里面load到內存中。
我們還可以看到最底層的節點之間會有鏈表相連。
在這里插入圖片描述

MyISAM存儲引擎索引實現

注意,存儲引擎是用來形容數據庫中的表的。
MyISAM索引文件數據文件是分離的。
我們使用查詢語句:

select * from ...  where Col1 = 49;

首先查找是否是索引字段,如果是就從MYI文件中的B+樹里面去定位到這個元素。key存儲的是索引元素,data存儲的是索引元素所在的那一行的磁盤地址指針。拿到指針后去MYD文件定位。
在這里插入圖片描述

InnoDB存儲引擎索引實現

索引和數據放到了同一個文件中:.ibd文件。
葉節點包含了完整的數據記錄,而不只是一個地址指針。
在這里插入圖片描述

常見問題

聚集索引與非聚集索引

InnoDB就是聚集索引,索引和數據文件合在一起。
MyISAM是非聚集索引,索引和數據文件分離。
非聚集索引要查找兩次,一次找到指針地址,一次根據指針地址找具體數據。
聚集索引只需要查找一次,直接找到具體數據,所以效率要更高。

InnoDB基于主鍵索引和普通索引的查詢有什么區別?

如果語句是 select * from T where ID=500,即主鍵查詢方式,則只需要搜索 ID 這棵 B+ 樹;
如果語句是 select * from T where k=5,即普通索引查詢方式,則需要先搜索 k 索引樹,得到 ID 的值為 500,再到 ID 索引樹搜索一次。這個過程稱為回表。
也就是說,基于非主鍵索引的查詢需要多掃描一棵索引樹。因此,我們在應用中應該盡量使用主鍵查詢。
在這里插入圖片描述

InnoDB主鍵索引為何是整型的自增主鍵

自增主鍵的使用,關于存儲性能
InnoDB必須要有主鍵,而且推薦使用的是整型的自增主鍵。
因為數字好建立索引,方便比較,而且相比較于字符串類型,占用的空間更小
關于自增:由于底層葉子節點是遞增排列的,如果此時主鍵是遞增的,那么新插入的元素就顯然在葉子節點的最右邊。
如果主鍵不是遞增的,插入一個新的元素可能就會在葉子節點鏈表中間某處。B+樹的結構調整就十分巨大了,可能上層的非葉子節點的索引值要修改。
例如這里我們插入8
在這里插入圖片描述
樹的結構發生了很大變化,直接裂開。
在這里插入圖片描述
自增主鍵的插入數據模式,每次插入一條新記錄,都是追加操作,都不涉及到挪動其他記錄,也不會觸發葉子節點的分裂。

何時使用業務字段作為主鍵呢?

只有唯一的索引,而且該索引為唯一索引。由于沒有其他索引,所以也就不用考慮其他索引的葉子節點大小的問題。
直接將這個索引設置為主鍵,可以避免每次查詢需要搜索兩棵樹。

哈希與B樹

哈希查找某個key很快,但是不支持范圍查找。
B樹用到范圍查找就很方便了。葉子節點從左到右是一個遞增的趨勢。并且葉子節點之間通過指針相連,所以不需要再返回到上層索引中尋找。如果我們要找大于20的元素,那么只要在最底層,20元素的右邊進行遍歷即可。
在這里插入圖片描述
如果是小于某個元素的情況,就是從底層葉子節點的左邊開始,一直包含到邊界即可。

“N叉樹”的N值在MySQL中是可以被人工調整的么?

1, 通過改變key值來調整
N叉樹中非葉子節點存放的是索引信息,索引包含Key和Point指針。Point指針固定為6個字節,假如Key為10個字節,那么單個索引就是16個字節。如果B+樹中頁大小為16K,那么一個頁就可以存儲1024個索引,此時N就等于1024。我們通過改變Key的大小,就可以改變N的值
2, 改變頁的大小
頁越大,一頁存放的索引就越多,N就越大。

數據頁調整后,如果數據頁太小層數會太深,數據頁太大,加載到內存的時間和單個數據頁查詢時間會提高,需要達到平衡才行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377263.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377263.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377263.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring之HibernateTemplate 和HibernateDaoSupport

spring提供訪問數據庫的有三種方式: HibernateDaoSupport HibernateTemplate(推薦使用) jdbcTemplate(我們一般不用) 類所在包: HibernateTemplate:org.springframework.orm.hibernate3.HibernateTemplate …

JDOJ-重建二叉樹

這是一道面試題,可以說是數據結構中的基礎題了,由先序遍歷以及中序遍歷生成一棵樹,然后輸出后序遍歷。 一個遞歸函數傳遞5個參數,頂點編號,先序左右區間,中序左右區間,每次進行區間長度判定&…

des算法密碼多長_密碼學中的多個DES

des算法密碼多長This is a DES that was susceptible to attacks due to tremendous advances in computer hardware in cryptography. Hence, it was a very complex or competent algorithm it would be feasible to reuse DES rather than writing an of cryptography. 由于…

《MySQL——索引筆記》

目錄回表覆蓋索引最左前綴原則聯合索引的時候,如何安排索引內的字段順序?索引下推重建索引問題聯合主鍵索引和 InnoDB 索引組織表問題in與between的區別回表 回到主鍵索引樹搜索的過程,我們稱為回表。 覆蓋索引 覆蓋索引就是在這次的查詢中…

計算凸多邊形面積的算法

1. 思路: 可以將凸多邊形(邊數n > 3)劃分為 (n - 2) 個三角形,分別運用向量叉積計算每個三角形的面積,最后累加各個三角形的面積就是多邊形的面積。 2. 求多邊形面積的算法模板:   定義點的結構體 str…

Windows CE開發常見問題解答

轉自: http://blog.csdn.net/slyzhang/article/details/6110490 1.怎樣在一個控件獲得焦點時打開軟鍵盤?比如一個EditBox獲得焦點后,這個時候自動打開軟鍵盤,這樣可以方便用戶輸入——SIPINFO、SHSIPINFO、SIPSETINFO、SIPGETINFO…

Julia中的supertype()函數

Julia| supertype()函數 (Julia | supertype() function) supertype() function is a library function in Julia programming language, it is used to get the concrete supertype of the given type (data type). supertype()函數是Julia編程語言中的庫函數,用于…

《操作系統知識點整理》

目錄進程與線程比較多線程同步與互斥生產者與消費者哲學家就餐問題讀者寫者問題進程間通信管道消息隊列共享內存信號量信號Socket鎖互斥鎖與自旋鎖讀寫鎖樂觀鎖與悲觀鎖死鎖進程與線程比較 進程是資源(包括內存、打開的文件等)分配的單位,線…

for,foreach,iterator的用法和區別

相同點&#xff1a; 三個都可以用來遍歷數組和集合不同點&#xff1a;1.形式差別 for的形式是 for&#xff08;int i0;i<arr.size();i&#xff09;{...} foreach的形式是 for&#xff08;int i&…

和菜鳥一起學linux總線驅動之初識spi驅動主要結構

既然知道了協議了&#xff0c;那么就可以開始去瞧瞧linux kenerl中的spi的驅動代碼了&#xff0c;代碼中有很多的結構體&#xff0c;還是對主要的結構體先做個了解吧&#xff0c;那樣才可以很好的理解驅動。主要是include/linux/spi.h 首先是SPI的主機和從機通信接口&#xff0…

操作系統大內核和微內核_操作系統中的內核

操作系統大內核和微內核A Kernel is the central component of an Operating System. The Kernel is also said to be the heart of the Operating System. It is responsible for managing all the processes, memory, files, etc. The Kernel functions at the lowest level …

《MySQL——鎖》

全局鎖是什么&#xff1f;全局鎖有什么用&#xff1f;全局鎖怎么用&#xff1f; 全局鎖主要用在邏輯備份過程中&#xff0c;對于InnoDB 引擎的庫&#xff0c;使用–single-transaction; MySQL 提供了一個加全局讀鎖的方法&#xff0c;命令是 Flush tables with read lock (FTW…

搜索引擎Constellio及Google Search Appliances connectors

做搜索產品的時候發現國外一個同類型的產品contellio&#xff0c;發現功能比較強大&#xff0c;先記錄下來 貌似可以添加文檔 網站 以及數據庫等不同類型的數據源 http://wiki.constellio.com/index.php/Main_Page http://www.constellio.com/ http://www.constellio.com htt…

dig下載_DIG的完整形式是什么?

dig下載DIG&#xff1a;副監察長 (DIG: Deputy Inspector General) DIG is an abbreviation of the Deputy Inspector General. It is a high-level position in the Indian Police Service. The officers who already offered service on Senior Superintendent of Police (SS…

分類器是如何做檢測的?——CascadeClassifier中的detectMultiScale函數解讀

原地址&#xff1a;http://blog.csdn.net/delltdk/article/details/9186875 在進入detectMultiScal函數之前&#xff0c;首先需要對CascadeClassifier做初始化。 1. 初始化——read函數 CascadeClassifier的初始化很簡單&#xff1a; cv::CascadeClassifier classifier; cl…

<MySQL>何時使用普通索引,何時使用唯一索引

如果能夠保證業務代碼不會寫入重復數據&#xff0c;就可以繼續往下看。 如果業務不能保證&#xff0c;那么必須創建唯一索引。 關于查詢能力 普通索引和唯一索引在查詢能力上是沒有很大差別的。 如&#xff1a;select id from T where k5 1、普通索引查找到滿足條件的第一個記…

Web版OutLook,利用POP接收郵件服務器郵件

一直想做一個Web版的OutLook&#xff0c;所以才萌生這個想法&#xff0c;其實以前也接觸過這方面的東西。于是上網找了找&#xff0c;漫天的都是Jmail來接收&#xff0c;好吧&#xff0c;既然大家都在用我也就下載下來試試了。 什么&#xff0c;怎么總是報錯呢&#xff1f;原來…

abs std::abs_ABS的完整形式是什么?

abs std::absABS&#xff1a;防抱死制動系統 (ABS: Anti-lock Braking System) ABS is an abbreviation of the Anti-lock Braking System. It is a safety anti-skid braking system that is used on a variety of aircraft, automobiles and other land vehicles, such as mo…

ubuntu 使用

shell 命令歷史搜索 &#xff1a; ctrl r使能 session 選擇界面&#xff1a;安裝gnome-session-fallback安裝lwqq轉載于:https://www.cnblogs.com/JonnyLulu/p/3600263.html

漢字速查使用方法簡介

《漢字速查》&#xff08;HanziSearcher&#xff09;是一個支持全漢字字典和詞典的檢索工具。其界面如下所示。 界面上方為工具欄。 左方為字典和詞典檢索欄。 右方在啟動時顯示版權信息和作者的聯系方式&#xff0c;在執行檢索時&#xff0c;顯示檢索結果。 檢索方法 漢字速查…