1. 程式人生 > 其它 >【SSL】1500最短路上的統計

【SSL】1500最短路上的統計

索引

什麼是索引

  • 在關係資料庫中,索引是一種單獨的、物理的對資料庫表中一列或多列的值進行排序的一種儲存結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的資料頁的邏輯指標清單。(百度百科)
  • 索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。
  • 索引是在儲存引擎層實現的, 所以並沒有統一的索引標準, 即不同的儲存引擎的索引工作方式並不一樣, 而即時多個儲存引擎都支援同一種類型的索引, 其底層的實現也可能不同

索引的作用 :

  • 索引的出現就是為了提高資料查詢的效率, 就像書的目錄一樣

索引的優點

  • 索引會讓我們的查詢次數降低, 實質層面上也就減少了 IO 操作, 因為 IO 操作相當費時
  • 幫助伺服器避免分組和排序, 因為索引在資料結構層面上, 已經有排序和分組的特徵
  • 穩定性 : 將隨機的 IO 變成順序性的 IO , B+索引會將相鄰的資料節點放在一起

索引的適合範圍 / 使用場景

  • 索引在小資料量的資料庫中, 發揮的作用並不大, 因為建立索引也是一定程度上增加了空間複雜度, 大部分建立全表掃描要比建立索引更加高效
  • 在中型資料量的資料庫上可以加索引, 因為這個可以大幅度提升資料的拆線呢效率
  • 大型資料量的資料庫上, 不僅需要索引, 也可考慮建立分庫分表技術來緩解資料庫的壓力

索引的模型

  • 雜湊表 : 是一種 鍵 - 值 ( key - value ) 儲存資料的結構

    • 思路 : 把值放在數組裡, 用一個雜湊函式把 key 換算成一個確定的位置, 然後把 value 放在陣列的這個位置
    • 缺點 : 做區間查詢的速度很慢
    • 使用場景 : 等值查詢的場景, 對範圍查詢無能為力
      • Memcached 以及其他 一些 NoSQL

在這裡插入圖片描述

  • 有序陣列

    • 以 Key 的遞增順序儲存資料在陣列中, 有序陣列在等值查詢和範圍查詢場景中的效能就都非常優秀
    • 缺點 : 在更新資料的時候, 移動資料成本太高
    • 使用場景 : 只適用靜態儲存引擎
      在這裡插入圖片描述
  • 搜尋樹

    • 二叉搜尋樹, 也稱為二叉查詢樹、有序二叉樹或排序二叉樹
    • 二叉搜尋樹相比於其它資料結構的優勢在於查詢、插入的時間複雜度較低,為 O(log(n))。為了維持 O(log(n))的查詢複雜度,需要保持這棵樹是平衡二叉樹
    • 查詢效率 O( log(N) )

在這裡插入圖片描述

  • n 叉樹

  • B+ 樹

    • 優點 :

      • 層級更低,IO 次數更少
      • 每次都需要查詢到葉子節點,查詢效能穩定
      • 葉子節點形成有序連結串列,範圍查詢方便
    • 操作演算法 :

      • 查詢 - > 由根節點自頂向下遍歷樹,根據分離值在要查詢的一邊的指標;在節點內使用二分查詢來確定位置。
      • 插入

      圖片

      • 刪除

      圖片

在這裡插入圖片描述

MySQL 中索引種類

  1. B+tree 索引是目前大多數 MySQL 預設索引方式, 索引又分為聚簇索引和 非聚簇索引, 聚簇索引是一個記錄著資料的索引節點, 非聚簇索引是存著主鍵 id, 再由 id 去尋找真實資料
  2. 雜湊索引 : 雜湊索引是查詢速度極快的索引, 其時間複雜度能達到 O(1), 但是由於是 hash 策略實現的, 所以不支援排序和分組, 只支援精確查詢, 不支援範圍查詢
  3. 全文索引 : InnoDB 不支援全文檢索, MyISAM 支援全文索引, 記錄著關鍵字到文獻的對映
  4. 空間資料索引 : 支援空間緯度上的索引機制, GIS 相關

InnoDB 的索引模型

  • 在 InnoDB 中, 表都是根據主鍵順序一索引的形式存放的, 這種儲存方式的表成為哦索引組織表, InnoDB 適用了 B+ 樹索引模型, 所以資料都是儲存在 B+ 樹中的
  • 每一個索引在 InnoDB 中都對應一顆 B+ 樹
#建表語句
mysql> create table T(
id int primary key, 
k int not null, 
name varchar(16),
index (k))engine=InnoDB;
  • 兩種索引
    • 索引分類 : 根據葉子節點的內容, 索引型別分為主鍵索引和非主鍵索引
    • 主鍵索引
      • 主鍵索引的葉子節點存放的是整行資料
      • 在 InnoDB 中, 主鍵索引也被稱為聚簇索引 ( clustered index )
    • 非主鍵索引
      • 非主鍵索引的葉子節點內容是主鍵的值
      • 在 InnoDB 中, 非主鍵索引也被稱為二級索引 ( secondary index )
  • 主鍵索引 和 普通索引 區別
    • SQL : select * from T where ID = 500 , 即主鍵查詢方式, 則只需要搜尋 ID 這顆 B+ 樹;
    • SQL : select * from T where k = 5, 即普通索引查詢方式, 則需要先搜尋 k 索引樹, 得到 ID 的值 500, 再到 ID 索引樹搜尋一次, 再得到結果, 這個過程稱為 回表
    • 基於非主鍵的搜尋的查詢需要多掃描一顆索引樹, 因此我們應當儘量適用主鍵索引

B+ Tree 的特性 :

  • 索引底層使用的是 B+tree 資料結構, 這種結構可以大幅度提升查詢效能, 因為 B+tree 底層是由葉子節點組成的單向列表, 塑造出它的穩定性, 尤其是範圍內的資料檢索
  • B 樹遍歷需要繁瑣的中序遍歷, B+S 樹就不需要, 直接讀取單鏈表就可以獲取範圍內資料, 由於 B+tree 相比較於 B 樹, 其樹的高度會相對比較低, 所以在遍歷時, 會少很多遍歷事件, 在時間複雜度上就很低, 所以 B+ 樹 是目前為止效能最高的索引結構, 效能高的影響因素是將傳統的順序遍歷改為 二分查詢

索引的優化

  • 索引的優化實質上就是儘可能的利用到索引, 索引在查詢過程中既不可能是函式的一部分, 也不能是表示式的一部分, 不然或導致索引失效的問題
  • 儘可能地使用多列索引, 多列索引會讓限制條件更加嚴格, 讓索引發揮更大的作用
  • 索引列的順序有時候也影響查詢效率
  • 對於 Blob, text, varchar 型別的資料使用字首索引效能最好, 可以只索引前部分的資料, 可以節省時間
  • 索引覆蓋

參考 :

  • https://time.geekbang.org/column/article/69236 林曉斌 -> MySQL實戰45講

  • 來自公眾號:騰訊技術工程 作者介紹:fanili,騰訊 WXG 後臺開發工程師

  • 《MySQL 技術內幕-InnoDB 儲存引擎》第二版,作者:姜承堯