淺談Mysql索引

逆月翎發表於2019-10-23

文章原創於公眾號:程式猿周先森。本平臺不定時更新,喜歡我的文章,歡迎關注我的微信公眾號。

file

我們都知道,資料庫索引可以幫助我們更加快速的找出符合的資料,但是如果不使用索引,Mysql則會從第一條開始查詢,直到查詢到符合的資料,這樣也會導致一個問題:如果沒有新增索引,表中資料很大則查詢資料花費的時間更多。而這時候我們為欄位新增一個索引,Mysql就會快速搜尋資料,可以節省大量時間。MyISAM和InnoDB是最經常使用的兩個儲存引擎,MyISAM和InnoDB索引都是採用B+樹的資料結構,那B樹和B+樹的區別是什麼呢?

B樹B樹是一種多路搜尋樹,搜尋時從根節點開始,對節點內的有序關鍵字進行二分查詢,如果命中則結束搜尋,否則根據搜尋大小結果進入左右子節點重複搜尋,直到找到搜尋結果。

特點:

  • 關鍵字分佈在B樹所有節點。
  • 關鍵字不會重複出現在多個節點。
  • 搜尋可能在非葉子節點就結束。

B+樹

B+樹實際上是一種特殊的B樹,和B樹感官最明顯的一個不同點在於B+樹關鍵字只會出現在葉子結點中,並且關鍵字在連結串列中是有序的,也就是B+樹的搜尋最後只會在葉子結點中命中結果,那非葉子結點在B+樹充當什麼角色呢?非葉子節點在B+樹中相當於是葉子結點的索引,而葉子結點是儲存關鍵字資料的資料層。既然Mysql索引採用B+樹的資料結構,那麼相比於B樹,B+樹做索引的優勢在哪裡呢:

  • 磁碟讀寫代價更低。
  • 查詢效率更穩定。
  • 遍歷元素效率高。

講完了B樹和B+樹的概念,接下來就需要開始談談索引了。其實Mysql索引的資料結構有兩種:B+樹、Hash。但是在MyISAM和InnoDB儲存引擎當中只能使用B+樹,索引其實總共可以分為四類:

  • 單列索引:單列索引有三種,包括普通索引、唯一索引、主鍵索引
  • 組合索引
  • 全文索引
  • 空間索引

單列索引

單列索引,顧名思義就是一個索引只能作用於單列,但是一個資料表可以同時擁有多個單列索引。單列索引一共有三種:普通索引、唯一索引、主鍵索引。

普通索引:

基本的索引型別,不會對資料加入任何限制,一樣允許新增了普通索引的普通索引的資料列存在空值或重複值,新增普通索引的目的只是為了查詢資料會更快一點。

唯一索引:

對單列新增唯一索引,就代表這個列只能是唯一值,比如使用者表使用者名稱可以新增唯一索引,這樣使用者名稱必須是唯一值,但是可以為空值。

主鍵索引:

其實就是在唯一索引的基礎上,不允許列出現空值的存在。

組合索引

選中資料表的多列組合然後建立索引,但是組合索引並不是說建立成功都可以被使用,而是需要遵循最左字首集合。也就是隻有在查詢條件中使用了這些欄位的左邊欄位,組合索引才會生效。下面我們舉個例子來解釋下什麼叫做最左字首。

首先建立一個表test1009,並且將id, username, sex三個列組合然後新增索引。

    CREATE TABLE test_10_09 (複製程式碼
    id INT NOT NULL,複製程式碼
    username VARCHAR (20) NOT NULL,複製程式碼
    idcard VARCHAR (18),複製程式碼
    sex VARCHAR (3) NOT NULL,複製程式碼
    INDEX MultiIdx (id, username, sex)複製程式碼
    )
複製程式碼

我們說組合索引想要生效需要滿足最左字首。那什麼叫做最左字首呢?最左字首其實就是利用組合索引中最左邊的列來匹配資料,以上面的例子我們可以看到,組合索引最左邊的列是id,所以說如果我們查詢的條件不包括id,也就是不滿足最左字首原則,這時候查詢操作是無法利用到我們建立的組合索引的。我們可以使用EXPLAIN指令來測試查詢條件帶與不帶id會有什麼效果:file

file

可以看到我們帶id查詢可以通過索引去查詢,但是查詢不帶id查詢無法觸發最左字首原則,於是組合索引並沒有生效。

全文索引

全文索引其實就是字面意思,使用全文索引可以在一連串文字中通過某個關鍵詞,就可以找到包含欄位的記錄行。但是全文索引有著很多限制:

  • 在InnoDB儲存引擎不支援使用,只允許在MyISAM儲存引擎中使用。
  • 全文索引只能在char、varchar、text三種型別的資料列使用。
  • 所搜的關鍵字預設至少要4個字元。
  • 全域性索引要藉助MATCH函式。

空間索引

  • mysql 5.7開始支援空間索引。空間索引一般是適用於包含空間操作的系統,比如遊戲開發。
  • 空間索引只能在GEOMETRY、POINT、LINESTRING、POLYGON4種空間資料型別的資料列使用。並且新增空間索引的資料列必須非空。
  • 在建立空間索引必須使用SPATIAL關鍵字。

索引優點

  • 資料表的所有資料列都可以新增索引。
  • 使用唯一索引或者主鍵索引可以保證資料的唯一性。
  • 使用索引可以提高查詢資料的效率和效能。

索引缺點

  • 使用索引會佔用一定的物理空間。
  • 資料插入以及修改都需要維護索引,會影響效能。

索引使用原則

  • 經常需要插入或者更新操作的表不宜設定太多索引,因為資料插入以及修改都需要維護索引,會影響效能。
  • 資料量少的表不建議新增索引,否則可能反而降低查詢效率及效能。
  • 在列取值範圍比較少時不使用索引,比如專業名只有三個取值,使用索引意義確實不大。
  • 組合索引將最經常使用的列放在第一列,保證組合索引能滿足最左字首的要求。
  • 如果列取值唯一,可以為欄位新增唯一性索引,提高查詢效率。
  • 索引儘量新增在資料量比較少的列上面,比如varchar(100)檢索效率肯定沒有varchar(30)來得快,所以說資料量多的列新增索引查詢效率會更慢。
    歡迎關注公眾號:程式猿周先森。文章原創於微信公眾號,本平臺不定時更新。

相關文章