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

溫馨提示×

溫馨提示×

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

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

面試時怎么表達你對MySQL索引的掌握程度

發布時間:2020-05-15 10:14:43 來源:億速云 閱讀:190 作者:三月 欄目:編程語言

下面講講關于面試時怎么表達你對MySQL索引的掌握程度,文字的奧妙在于貼近主題相關。所以,閑話就不談了,我們直接看下文吧,相信看完面試時怎么表達你對MySQL索引的掌握程度這篇文章你一定會有所受益。

一、索引是什么?

索引是幫助MySQL高效獲取數據的數據結構。

二、索引能干什么?

索引非常關鍵,尤其是當表中的數據量越來越大時,索引對于性能的影響愈發重要。索引能夠輕易將查詢性能提高好幾個數量級,總的來說就是可以明顯的提高查詢效率。

三、索引的分類?

1、從存儲結構上來劃分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。這里所描述的是索引存儲時保存的形式,

2、從應用層次來分:普通索引,唯一索引,復合索引

3、根據中數據的物理順序與鍵值的邏輯(索引)順序關系:聚集索引,非聚集索引。

平時講的索引類型一般是指在應用層次的劃分。

就像手機分類:安卓手機,IOS手機 與 華為手機,蘋果手機,OPPO手機一樣。

普通索引:即一個索引只包含單個列,一個表可以有多個單列索引

唯一索引:索引列的值必須唯一,但允許有空值

復合索引:多列值組成一個索引,專門用于組合搜索,其效率大于索引合并

聚簇索引(聚集索引):并不是一種單獨的索引類型,而是一種數據存儲方式。具體細節取決于不同的實現,InnoDB的聚簇索引其實就是在同一個結構中保存了B-Tree索引(技術上來說是B+Tree)和數據行。

非聚簇索引:不是聚簇索引,就是非聚簇索引

四、索引的底層實現

mysql默認存儲引擎innodb只顯式支持B-Tree( 從技術上來說是B+Tree)索引,對于頻繁訪問的表,innodb會透明建立自適應hash索引,即在B樹索引基礎上建立hash索引,可以顯著提高查找效率,對于客戶端是透明的,不可控制的,隱式的。

不談存儲引擎,只討論實現(抽象)

Hash索引

基于哈希表實現,只有精確匹配索引所有列的查詢才有效,對于每一行數據,存儲引擎都會對所有的索引列計算一個哈希碼(hash code),并且Hash索引將所有的哈希碼存儲在索引中,同時在索引表中保存指向每個數據行的指針。

面試時怎么表達你對MySQL索引的掌握程度

B-Tree索引(MySQL使用B+Tree)

B-Tree能加快數據的訪問速度,因為存儲引擎不再需要進行全表掃描來獲取數據,數據分布在各個節點之中。

面試時怎么表達你對MySQL索引的掌握程度

B+Tree索引

是B-Tree的改進版本,同時也是數據庫索引索引所采用的存儲結構。數據都在葉子節點上,并且增加了順序訪問指針,每個葉子節點都指向相鄰的葉子節點的地址。相比B-Tree來說,進行范圍查找時只需要查找兩個節點,進行遍歷即可。而B-Tree需要獲取所有節點,相比之下B+Tree效率更高。(排序查找算法系統的學習,可以在Java知音公眾號回復“排序算法聚合”)

面試時怎么表達你對MySQL索引的掌握程度

結合存儲引擎來討論(一般默認使用B+Tree)

案例:假設有一張學生表,id為主鍵

面試時怎么表達你對MySQL索引的掌握程度

在MyISAM引擎中的實現(二級索引也是這樣實現的)

面試時怎么表達你對MySQL索引的掌握程度

在InnoDB中的實現

面試時怎么表達你對MySQL索引的掌握程度

五、為什么索引結構默認使用B+Tree,而不是Hash,二叉樹,紅黑樹?

B-tree:因為B樹不管葉子節點還是非葉子節點,都會保存數據,這樣導致在非葉子節點中能保存的指針數量變少(有些資料也稱為扇出),指針少的情況下要保存大量數據,只能增加樹的高度,導致IO操作變多,查詢性能變低;

Hash:雖然可以快速定位,但是沒有順序,IO復雜度高。

二叉樹:樹的高度不均勻,不能自平衡,查找效率跟數據有關(樹的高度),并且IO代價高。

紅黑樹:樹的高度隨著數據量增加而增加,IO代價高。

六、為什么官方建議使用自增長主鍵作為索引?

結合B+Tree的特點,自增主鍵是連續的,在插入過程中盡量減少頁分裂,即使要進行頁分裂,也只會分裂很少一部分。并且能減少數據的移動,每次插入都是插入到最后。總之就是減少分裂和移動的頻率。

插入連續的數據:

面試時怎么表達你對MySQL索引的掌握程度

插入非連續的數據:

面試時怎么表達你對MySQL索引的掌握程度

七、簡單總結下

1、MySQL使用B+Tree作為索引數據結構。

2、B+Tree在新增數據時,會根據索引指定列的值對舊的B+Tree做調整。

4、從物理存儲結構上說,B-Tree和B+Tree都以頁(4K)來劃分節點的大小,但是由于B+Tree中中間節點不存儲數據,因此B+Tree能夠在同樣大小的節點中,存儲更多的key,提高查找效率。

5、影響MySQL查找性能的主要還是磁盤IO次數,大部分是磁頭移動到指定磁道的時間花費。

6、MyISAM存儲引擎下索引和數據存儲是分離的,InnoDB索引和數據存儲在一起。

7、InnoDB存儲引擎下索引的實現,(輔助索引)全部是依賴于主索引建立的(輔助索引中葉子結點存儲的并不是數據的地址,還是主索引的值,因此,所有依賴于輔助索引的都是先根據輔助索引查到主索引,再根據主索引查數據的地址)。

8、由于InnoDB索引的特性,因此如果主索引不是自增的(id作主鍵),那么每次插入新的數據,都很可能對B+Tree的主索引進行重整,影響性能。因此,盡量以自增id作為InnoDB的主索引。

對于以上面試時怎么表達你對MySQL索引的掌握程度相關內容,大家還有什么不明白的地方嗎?或者想要了解更多相關,可以繼續關注我們的行業資訊板塊。

向AI問一下細節

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

AI

青海省| 天柱县| 五台县| 洪湖市| 辽源市| 灵丘县| 仁怀市| 安阳县| 崇礼县| 新丰县| 宁强县| 山东| 兴国县| 通海县| 文水县| 开平市| 会泽县| 佛坪县| 武胜县| 改则县| 革吉县| 绿春县| 康定县| 嘉鱼县| 民权县| 佳木斯市| 潜山县| 林口县| 合水县| 封开县| 武邑县| 特克斯县| 胶南市| 新竹市| 青冈县| 哈密市| 盘山县| 荆门市| 本溪| 绍兴市| 隆安县|