面經:mysql索引

1. 數據結構

  mysql 使用的是(Balance+ Tree,也就是平衡樹)B+樹,在B樹的基礎上做了優化,B+ Tree 是基於 B Tree 和葉子節點順序訪問指針進行實現,它具有 B Tree 的平衡性,並且通過順序訪問指針來提高區間查詢的性能。

2. 查詢性能和原理

2.1 減少IO次數
  樹的查詢速度是取決於樹的高度,一般的樹,如紅黑樹每個節點掛了2個子葉,mysql爲了提供性能在每個節點下掛了更多子葉,這樣可以減少IO的次數.
2.2 利用磁盤預讀特性
  爲了減少磁盤 I/O,磁盤往往不是嚴格按需讀取,而是每次都會預讀。預讀過程中,磁盤進行順序讀取,順序讀取不需要進行磁盤尋道,並且只需要很短的旋轉時間,速度會非常快。        
  操作系統一般將內存和磁盤分割成固態大小的塊,每一塊稱爲一頁,內存與磁盤以頁爲單位交換數據。數據庫系統將索引的一個節點的大小設置爲頁的大小,使得一次 I/O 就能完全載入一個節點。並且可以利用預讀特性,相鄰的節點也能夠被預先載入.

3.mysql索引

3.1 InnoDB
  mysql默認使用的是InnoDB.
  InnoDB 的 B+Tree 索引分爲主索引和輔助索引。主索引的葉子節點 data 域記錄着完整的數據記錄,這種索引方式被稱爲聚簇索引(聚簇索引是將數據和索引放在一起,這樣可以讓查詢的速度更快)。

在這裏插入圖片描述
當然還有另一種索引,哈希索引.

3.2 哈希索引
使用InnoDB的基本所有查詢的時間複雜度是O(lg n),包含grup by,order by.
哈希索引的單點查詢時間複雜度是O(1),如果是grup by,order by是O(n).
3.3 全文索引
MyISAM支持全文索引,而InnoDB也是在 MySQL 5.6.4 版本中也開始支持全文索引.
3.4 空間數據索引
MyISAM 存儲引擎支持空間數據索引(R-Tree),可以用於地理數據存儲。空間數據索引會從所有維度來索引數據,可以有效地使用任意維度來進行組合查詢。必須使用 GIS 相關的函數來維護數據。
3.5 索引優化
 1.索引支持單列索引和多列多列索引,在索引的選用中一般會要選擇散列度高.
 2.在多列索引中,一般要將散列度(選擇度)高的索引放在前面,這樣性能更好.
 3.對應要儲存字符串的列(varchar,text..)加索引時要添加前綴索引.
 4.覆蓋索引,即索引中包含where條件要查的值.好處是減少了大量的訪問,畢竟索引通常遠小於數據行的大小,只讀取索引能大大減少數據訪問量。在innoDB中索引中包含對應的值,可以不用訪問主鍵(主索引).
 5.索引的最左前綴原則
 例如建立一個索引對應的列是:column1,column2,column3
 在實際中是產生了三個索引:(column1),(column1,column2),(column1,column2,column3),所以建議最左邊的這個column1要是用散列度高的列可以提高查詢的性能,
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章