Java高頻面試題:談談你對MySQL索引的瞭解

千鋒IT教育發表於2022-10-31

今天帶大家一起看看Mysql索引相關的面試題。

一.  MySQL索引分類

我們先來看看MySQL中都有哪些索引。

  • 普通索引index:允許出現相同的索引內容create index name on 表名(列名)
  • 唯一索引unique:不可以出現相同的值,可以有NULL值create unique age 表名(列名)
  • 聯合索引:實質上是將多個欄位建到一個索引裡,列值的組合必須唯一create index name on 表名(列名,列名)
  • 全文索引:可以針對值中的某個單詞,但效率不高alter table 表名 engine = MyISAM;--全文索引需求在資料庫MyISAM引擎 alter table 表名 add fulltext index 索引名(列名);


二.  索引的原理

索引的原理,其實就是透過不斷地縮小想要獲取資料的範圍,來篩選出最終想要的結果,同時把隨機的事件變成順序的事件!也就是說,有了這種索引機制,我們可以總是用同一種查詢方式來鎖定資料。

本質上來說,索引就是讓我們快速檢索資料而設定的一種把資料排好序的資料結構,他需要額外的空間儲存並進行維護。索引底層的資料結構分別有二分查詢法、Hash和B+樹。

三.  B+樹

InnoDB引擎使用B+樹作為索引結構。

特點:

  1. B+ 樹的特點是能夠保持資料穩定有序;
  2. 插入與修改擁有較穩定的時間複雜度;
  3. B+ 樹中的元素自底向上插入;
  4. 葉子節點間透過指標連結,可以透過遍歷葉子節點獲取所有資料。


性質:

  1. IO次數取決於b+數的高度h,假設當前資料表的資料為N,每個磁碟塊資料項的數量是m,則有h=㏒(m+1)N;
  2. m = 磁碟塊的大小 / 資料項的大小,磁碟塊的大小也就是一個資料頁的大小,是固定的;
  3. 索引的最左匹配特性(即從左往右匹配),比如(name,age,sex)的時候,b+樹是按照從左到右的順序來建立搜尋樹的。假如當(張三,20,F)這樣的資料來檢索的時候,b+樹會優先比較name,來確定下一步的搜尋方向。如果name相同,再依次比較age和sex,最後得到檢索的資料。但當(20,F)這樣沒有name的資料進來的時候,b+樹就不知道下一步該查哪個節點了。因為建立搜尋樹的時候,name是第一個比較因子,必須要先根據name來搜尋,才能知道下一步去哪裡查詢。


四.  索引的使用

我們在使用時,還要知道到底該什麼時候使用索引,有以下幾種情況:

  1. 主鍵自動建立唯一索引;
  2. 經常作為查詢條件,在WHERE或者ORDER BY 語句中出現的列,應該建立索引;
  3. 作為排序的列要建立索引;
  4. 外來鍵關係建立索引;
  5. 高併發條件下傾向聯合索引;
  6. 用於聚合函式的列可以建立索引,如max、count的欄位就需要建立索引。


另外我們還要注意,某些操作不當可能會導致索引失效,比如:

  1. 使用!=或<>運算子時,會全表掃描而不使用索引(ps:如果是主鍵還是會走索引);
  2. where子句中,對欄位進行 null 判斷會全表掃描;
  3. where 子句中,使用 or 來連線條件查詢會全表掃描;
  4. like查詢會全表掃描;
  5. in 和 not in 會全表掃描;
  6. where子句中,對欄位進行函式操作,如where datediff(now(),bornDate)=0會導致索引失效。


現在你對索引是不是有了基本地瞭解了呢?當然,受限於篇幅,本文只是簡單讓大家認識一下索引。其實關於索引的內容還有很多,在我們的課程中有專門的索引專題進行講解,歡迎大家學習哦。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70023145/viewspace-2921186/,如需轉載,請註明出處,否則將追究法律責任。

相關文章